当前位置: 首页 > 面试题库 >

解码Javascript / jQuery中的base64文件以供下载

吴哲
2023-03-14
问题内容

今天,我一直在尝试使用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中)找到正确的路径。

我这样做的方法是创建一个HTTP处理程序(Controller,ASHX,ASPX等),该处理程序设置正确的HTTP标头并将从SQL
Server检索到的数据Response.BinaryWrite()作为字节数组传递。这是快速,清洁和可靠的。它也需要很少的代码。

相比之下,base 64编码会增加文件大小,并且我不知道有任何可靠的方法来处理base
64字符串客户端并指示浏览器使用正确的应用程序打开它。另外,编码/解码完全是不必要的开销(这在大文件上可能很重要)。

顺便说一句,您也可以对图像使用HTTP处理程序。或者,您可以继续使用base
64,但将所有图像放在一个JSON对象中,这将减少请求数量(以更多的客户端处理代码为代价)。

HTTP处理程序示例

我将一些生产代码分解为仅处理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页面中,并在按钮单击,页面事件等情况下触发它。



 类似资料:
  • 我想下载一个JS中的图像,它是bas64编码的。为此,我首先解码了图像并尝试下载它。文件正在下载,但下载文件中的内容什么都不是。 编码后的图像就像: data: Image/png; bas64, iVBORw0KGgoAAAANSUhEUGAAAAUAAAFCAYAAACNbyblAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAABJ

  • 我收到一个作为当前href的一部分。它是用base64编码的。我尝试使用对其进行解码,但得到以下错误: 在“window”上执行“atob”失败:要解码的字符串编码不正确 当我在代码中复制并粘贴提取的并转到一个在线解码站点时,它会正确解码。你有什么建议吗?

  • 问题内容: JavaScript中是否可以使用base64编码对字符串进行编码和解码的任何方法? 问题答案: 某些浏览器(例如Firefox,Chrome,Safari,Opera和IE10+)可以原生处理Base64。看一下这个Stackoverflow问题。它正在使用和函数。 对于服务器端JavaScript(节点),可以使用进行解码。 如果您要使用跨浏览器解决方案,则可以使用现有的库,例如C

  • 介绍 Base64编码是用64(2的6次方)个ASCII字符来表示256(2的8次方)个ASCII字符,也就是三位二进制数组经过编码后变为四位的ASCII字符显示,长度比原来增加1/3。 使用 String a = "伦家是一个非常长的字符串"; //5Lym5a625piv5LiA5Liq6Z2e5bi46ZW/55qE5a2X56ym5Liy String encode = Base64.en

  • 问题内容: 我在这里指定了非常相似的要求。 我需要让用户的浏览器在以下情况下手动开始下载 但是我无法使用该方法,因为它将当前页面内容替换为您尝试下载的文件。 相反,我想在新窗口/选项卡中打开下载。这怎么可能? 问题答案: 使用不可见的: 要强制浏览器下载本来可以呈现的文件(例如HTML或文本文件),则需要服务器将文件的MIME类型设置为无意义的值,例如或另外,用于任意二进制数据。 如果只想在新标签

  • 问题内容: 我想知道哪个库用于base64编码/解码?我需要此功能足够稳定以供生产使用。 问题答案: Java 9 使用Java 8解决方案。注意DatatypeConverter仍可以使用,但现在位于模块中,需要将其包括在内。 Java 8 Java8现在提供了对base64进行编码和解码的功能。 编码方式 解码 Java 6和7 从Java 6开始,可以使用鲜为人知的类。这是JRE的一部分,不