将文件作为 varbinary(max) 保存到 SQL 的问题

Posted

技术标签:

【中文标题】将文件作为 varbinary(max) 保存到 SQL 的问题【英文标题】:Issue with saving files into SQL as varbinary(max) 【发布时间】:2021-10-23 14:23:47 【问题描述】:

所以,我有一个 Web 应用程序将一些附件作为VarBinary(max) 保存到 SQL 数据库中,一切正常,直到我意识到当我从数据库下载附件时,文件与原始大小相比非常大,所以一个400KB的文件,下载的就是5MB!我做错了什么?

上传代码为:

Dim img As FileUpload = CType(FileUpload1, FileUpload)
Dim imgByte As Byte() = Nothing
If img.HasFile AndAlso Not img.PostedFile Is Nothing Then
    Dim File As HttpPostedFile = FileUpload1.PostedFile
    imgByte = New Byte(File.ContentLength - 1) 
    File.InputStream.Read(imgByte, 0, File.ContentLength)
    cmd.Parameters.AddWithValue("@filetype", Path.GetExtension(FileUpload1.FileName).ToLower)
    cmd.Parameters.AddWithValue("@attachment", imgByte)
End If

下载代码:

Dim imagem As Byte() = CType((dr("attachment")), Byte())
Response.Clear()
Response.AddHeader("Cache-Control", "no-cache, must-revalidate, post-check=0, pre-check=0")
Response.AddHeader("Pragma", "no-cache")
Response.AddHeader("Content-Description", "File Download")
Response.AddHeader("Content-Type", "application/force-download")
Response.AddHeader("Content-Transfer-Encoding", "binary\n")
Dim fileName As String = "attachment; filename=" & "DOC_REFNO_" & "_" & regref_txt.Text.Replace("/", "_") & dr("filetype")
Response.AddHeader("content-disposition", fileName)
Response.BinaryWrite(imagem)

谢谢大家。

【问题讨论】:

您使用的是哪个 dbms? SQL 服务器 2017 该比率建议您在下载时获得 base64 编码版本。但我不知道会在哪里以及为什么会这样。在 sql server 表中使用 DATALENGTH 测量存储文件的大小,以确定膨胀是在存储时发生还是在检索时发生。传输编码后的\n是什么意思? 老实说我现在不知道,我从网上复制了代码。 不要使用addwithvalue 【参考方案1】:

所以我发现下载的代码不正确,我改成下面的代码就完美了。

 Dim imagem As Byte() = CType((dr("attachment")), Byte())
            Response.Buffer = True
            Response.Charset = ""
            Response.Cache.SetCacheability(HttpCacheability.NoCache)
            Response.ContentType = ContentType
            Dim fileName As String = "attachment; filename=" & "DOC_REFNO_" & "_" & regref_txt.Text.Replace("/", "_") & dr("filetype")

            Response.AddHeader("content-disposition", fileName)
            Response.BinaryWrite(imagem)
            Response.Flush()
            Response.End()

【讨论】:

虽然您解决了自己的问题,但我建议您看看 MS SQL 的 FileTables 用于存储文件而不是 VarBinary(max) 列?它是 MS SQL 2012 中引入的一种有用的表类型。

以上是关于将文件作为 varbinary(max) 保存到 SQL 的问题的主要内容,如果未能解决你的问题,请参考以下文章

在实体框架中将对象类型属性映射到 varbinary(MAX)

将 UTF-8 varbinary(max) 转换为 varchar(max)

VarBinary(max) 到整数列表

在 SQL Server 2012 中作为 Varbinary(MAX) 的照片在 Access 2010 中导致错误 502753

VarBinary(max) 在 SQL Azure 上更新非常慢

不允许从数据类型 nvarchar 到 varbinary(max) 的隐式转换