我有一个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或类似文件写入文件表。如果是这样,我该怎么做?
这是一个权限问题。但是,权限不是通过NTFS授予的,而是通过SQL Server授予的。
默认情况下,“应用程序池标识”对您的数据库没有任何权限,因此必须进行更改。
USE [master] GO CREATE LOGIN [IIS APPPOOL\myapppoolname] FROM WINDOWS WITH DEFAULT_DATABASE=[MyDatabase] GO
USE [MyDatabase] CREATE USER [MyUserName] FOR LOGIN [IIS APPPool\myapppoolname]
use [MyDatabase] GRANT INSERT TO [MyUserName] GRANT SELECT TO [MyUserName] GRANT UPDATE TO [MyUserName]
我不确定这是否是所需的完整权限集,但我发现足以保存新文件就足够了。