小编典典

使用ASP.NET网站中的File.CreateFile将文件插入Sql Server 2012 FileTable时访问被拒绝

sql

我有一个ASP.NET网站。我想将文件上传到网站并将其保存到SqlServer 2012中的FileTable中。

上传后,我的网站代码包含一个Stream对象,我想使用该对象保存

System.IO.File.Create()

当我转到Windows时,可以在Windows资源管理器中访问FileTable。

\\ComputerName\FileStremShareName\FileStreamDirectoryName\FileTableName

我可以使用Windows资源管理器在此文件夹中手动创建文件。我还可以使用SQL将文件插入到File表中。在这两种情况下,Windows资源管理器和SQL
Server均按预期显示文件。

但是,如果我尝试使用System.IO.File.CreateFile在路径中创建文件,例如

File.Create(\\\\ComputerName\FileStremShareName\FileStreamDirectoryName\FileTableName\myfile.jpg)

我收到消息“拒绝访问路径’[path]’”

我认为这是因为我的IIS应用程序池标识无权读取/写入此位置。

通常,我将进入NTFS权限并为“标识”帐户分配“读/写”访问权限,但由于基础文件夹对我而言是隐藏的,因此我无法执行此操作。

我考虑过将Stream对象转换为字节数组,然后使用SQL将其插入FileTable中,但这似乎效率不高,因为我必须先将流转换为字节数组,然后才能将其传递给SQL。好像我在两次解析文件数据以保存一次。

是否可以在ASP.NET网站中使用File.Create或类似文件写入文件表。如果是这样,我该怎么做?


阅读 152

收藏
2021-05-05

共1个答案

小编典典

这是一个权限问题。但是,权限不是通过NTFS授予的,而是通过SQL Server授予的。

默认情况下,“应用程序池标识”对您的数据库没有任何权限,因此必须进行更改。

  1. 将用于您网站的应用程序池标识的登录名添加到SQL Server。例如“ IIS APPPool \ MyAppPool”
USE [master]
GO
CREATE LOGIN [IIS APPPOOL\myapppoolname] FROM WINDOWS WITH DEFAULT_DATABASE=[MyDatabase]
GO
  1. 将一个用户添加到您的数据库中,此登录名将使用该用户
USE [MyDatabase]
CREATE USER [MyUserName] FOR LOGIN [IIS APPPool\myapppoolname]
  1. 向用户授予数据库相关权限
use [MyDatabase]
GRANT INSERT TO [MyUserName]
GRANT SELECT TO [MyUserName]
GRANT UPDATE TO [MyUserName]

我不确定这是否是所需的完整权限集,但我发现足以保存新文件就足够了。

2021-05-05