将文件作为 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)
在 SQL Server 2012 中作为 Varbinary(MAX) 的照片在 Access 2010 中导致错误 502753