5

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

上传后,我的网站代码有一个 Stream 对象,我想使用它来保存

System.IO.File.Create()

当我转到时,可以在 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 或类似方法写入文件表。如果是这样,我该怎么做?

4

3 回答 3

6

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

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

  1. 为您的网站使用的应用程序池标识添加 SQL Server 登录名。例如“IIS APPPool\MyAppPool”

    使用 [主]
    去
    从 WINDOWS 使用 DEFAULT_DATABASE=[MyDatabase] 创建登录 [IIS APPPOOL\myapppoolname]
    去
    
  2. 将用户添加到此登录将使用的数据库

    使用 [我的数据库]
    为登录 [IIS APPPool\myapppoolname] 创建用户 [MyUserName]
    
  3. 授予用户对您的数据库的相关权限

    使用 [我的数据库]
    授予插入 [MyUserName]
    将选择授予 [MyUserName]
    向 [MyUserName] 授予更新
    

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

于 2014-06-04T09:17:56.367 回答
0

接受的答案对我不起作用。此链接中的答案确实如此。

我的 IIS 服务器与 sql 数据库不在同一台服务器上,因此我必须确保 IIS 的应用程序池用户作为 sql 服务器上的 windows 用户存在,它们具有相同的密码并且存在 sql windows帐户的用户。

于 2018-06-14T11:16:54.260 回答
0

我遇到过同样的问题。以下答案对我有用。

  1. 使用相同的密码在两台服务器上创建一个新帐户。
  2. 配置该帐户以运行您的 IIS 应用程序
  3. 在 SQL Server 中为该帐户创建具有适当权限的登录名。
于 2018-10-24T07:54:14.183 回答