今天,我一直在尝试使用SQL二进制对象。我首先将图像存储在表中,向图像进行base64编码的AJAX请求,然后与之一起显示。
<img src="data:image/jpeg;base64,' + base64imageReturnedWithAjax + '">')
图像显示良好。
我正在处理的Web项目也需要文件下载(主要是PDF)-太好了,我想,我也将PDF存储为SQL二进制对象,以相同的方式从服务器收集它,然后以某种方式神奇地解码在另一端下载。
帮助!
我首先尝试使用jQuery base64解码器(https://github.com/carlo/jquery-base64)将其解码:
$.base64.decode(base64fileReturnedWithAjax)
这会在控制台中生成以下错误:
Uncaught Cannot decode base64 _getbyte64 _decode $.ajax.success f.Callbacks.o f.Callbacks.p.fireWith w f.support.ajax.f.ajaxTransport.send.d
因此,我的问题是:这是处理文件下载的可行方法吗?如果是这样,如何!如果没有,是否有建议的方法允许从SQL表下载文件?
此致ATfPT
编辑:如果有帮助,这是从db / server(在VB.NET中)检索并发送文件的web方法。Fileblob是数据库中的二进制对象。
'Having connected to the table While lrd.Read() Dim fileBytes = CType(lrd("Fileblob"), Byte()) Dim stream = New MemoryStream(fileBytes, 0, fileBytes.Length) Dim base64String = Convert.ToBase64String(stream.ToArray()) document.Add(base64String) End While Dim serializer As New JavaScriptSerializer() Dim returnVal As String = serializer.Serialize(document) Return returnVal
内联基础64可以很好地处理图像(只要图像很小),因此您可能处在正确的轨道上。但是,我认为您没有为PDF或大多数其他Blob(varbinary(max)在SQL Server中)找到正确的路径。
varbinary(max)
我这样做的方法是创建一个HTTP处理程序(Controller,ASHX,ASPX等),该处理程序设置正确的HTTP标头并将从SQL Server检索到的数据Response.BinaryWrite()作为字节数组传递。这是快速,清洁和可靠的。它也需要很少的代码。
Response.BinaryWrite()
相比之下,base 64编码会增加文件大小,并且我不知道有任何可靠的方法来处理base 64字符串客户端并指示浏览器使用正确的应用程序打开它。另外,编码/解码完全是不必要的开销(这在大文件上可能很重要)。
顺便说一句,您也可以对图像使用HTTP处理程序。或者,您可以继续使用base 64,但将所有图像放在一个JSON对象中,这将减少请求数量(以更多的客户端处理代码为代价)。
我将一些生产代码分解为仅处理PDF的部分。 这应该进行最少的修改。
首先将通用处理程序添加到Visual Studio中的项目。它将具有ASHX扩展名。
public partial class RequestHandler : IHttpHandler { public void ProcessRequest( HttpContext context ) { HttpRequest request = context.Request; HttpResponse response = context.Response; byte[] bytes = null; // get from your database string fileName = null; // get from database or put something generic here like "file.pdf" response.ContentType = "application/pdf"; response.AddHeader( "content-disposition", "inline;filename=" + fileName ); response.AddHeader( "Content-Length", bytes.Length.ToString() ); response.Buffer = true; response.BinaryWrite( bytes ); response.Flush(); } public bool IsReusable { get { return true; } } }
要调用此代码,您可以简单地链接到它,例如<a href="RequestHandler.ashx?id=abc">Download</a>。您还可以将该代码放入ASPX页面中,并在按钮单击,页面事件等情况下触发它。
<a href="RequestHandler.ashx?id=abc">Download</a>