我有一个内部网应用程序,用于在SQL文件流中存储文件。
在我的开发机器上,一切都像魅力一样。
我可以将文件上传并存储到SQL文件流(AjaxUpload)中,并能够将它们下载。
在实时服务器上,我可以上传文件,删除它们,但是当我尝试从文件流下载文件时,我收到以下错误:
Access is denied
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.ComponentModel.Win32Exception: Access is denied
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:
[Win32Exception (0x80004005): Access is denied]
System.Data.SqlTypes.SqlFileStream.OpenSqlFileStream(String path, Byte[] transactionContext, FileAccess access, FileOptions options, Int64 allocationSize) +1465594
System.Data.SqlTypes.SqlFileStream..ctor(String path, Byte[] transactionContext, FileAccess access, FileOptions options, Int64 allocationSize) +398
System.Data.SqlTypes.SqlFileStream..ctor(String path, Byte[] transactionContext, FileAccess access) +27
quotes_GetFileStream.quotes_GetFileStream_Load(Object sender, EventArgs e) +740
System.Web.UI.Control.LoadRecursive() +71
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3048
应用程序池设置为集成,V.4.0,我使用域用户进行身份验证,返回SQL。
我将该用户的DB_Owner权限授予该应用程序的SQL数据库。
甚至尝试过给它所有的SQL Server角色,尽管我仍然遇到上述错误。
当我将身份用户名更改为我的(我拥有域管理员权限)时,所有内容都在实时服务器上完美运行。
我没有给予该用户哪些权利,以便他可以正确地从SQL文件流中读取。
以下是从文件流中获取文件并将其推送到浏览器的代码块,也许我在这里遗漏了一些东西(虽然一旦我修改了用户,它就会很好用。)
Dim RecId As Integer = -1
If Not IsNothing(Request.QueryString("ID")) And IsNumeric(Request.QueryString("ID")) Then
RecId = CType(Request.QueryString("ID"), Integer)
End If
Dim ConString As String = ConfigurationManager.ConnectionStrings("ConnectionString").ToString
Using Con As SqlConnection = New SqlConnection(ConString)
Con.Open()
Dim txn As SqlTransaction = Con.BeginTransaction()
Dim Sql As String = "SELECT FileData.PathName() , GET_FILESTREAM_TRANSACTION_CONTEXT() as TransactionContext, [FileName], [FileExtension] FROM [QAttach] where RecId = @RecId"
Dim cmd As SqlCommand = New SqlCommand(Sql, Con, txn)
cmd.Parameters.Add("@RecID", Data.SqlDbType.Int).Value = RecId
Dim Rdr As SqlDataReader = cmd.ExecuteReader()
While Rdr.Read()
Dim FilePath As String = Rdr(0).ToString()
Dim objContext As Byte() = DirectCast(Rdr(1), Byte())
Dim fname As String = Rdr(2).ToString()
Dim FileExtension As String = Rdr(3).ToString()
Dim sfs As SqlFileStream = New SqlFileStream(FilePath, objContext, FileAccess.Read)
Dim Buffer As Byte() = New Byte(CInt(sfs.Length) - 1) {}
sfs.Read(Buffer, 0, Convert.ToInt32(Buffer.Length))
Response.Buffer = True
Response.Charset = ""
Response.Cache.SetCacheability(HttpCacheability.NoCache)
Response.ContentType = FileExtension
Response.AddHeader("content-disposition", "attachment;filename=" & fname)
Response.BinaryWrite(Buffer)
Response.Flush()
Response.End()
sfs.Close()
End While
End Using
由于
奥伦
答案 0 :(得分:3)
FILESTREAM需要连接字符串的集成安全性。不支持SQL Server身份验证。
答案 1 :(得分:2)
我有同样的问题,我能够通过确保用于访问数据库的帐户对正在访问的表中的FILESTREAM列具有SELECT和UPDATE权限来解决问题。这是所需的T-SQL代码:
GRANT SELECT, UPDATE ON OBJECT::[schema name].[table name]([file stream column name]) TO [the role/user to grant the rights to] AS [dbo];
GO
答案 2 :(得分:1)
更像是问题在于操作系统权限而不是SQL Server权限。尝试向创建文件流的路径授予对应用程序池使用的域帐户的读/写访问权限