Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript/jQuery中解码base64文件以供下载_Jquery_Sql_Ajax_Base64_Download - Fatal编程技术网

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

在Javascript/jQuery中解码base64文件以供下载,jquery,sql,ajax,base64,download,Jquery,Sql,Ajax,Base64,Download,今天我一直在试验SQL二进制对象。首先,我将一个图像存储在一个表中,对图像进行base64编码,并用AJAX显示它 <img src="data:image/jpeg;base64,' + base64imageReturnedWithAjax + '">') 这会在控制台中生成以下错误: Uncaught Cannot decode base64 _getbyte64 _decode $.ajax.success f.Callbacks.o f.Callbacks.p.fireW

今天我一直在试验SQL二进制对象。首先,我将一个图像存储在一个表中,对图像进行base64编码,并用AJAX显示它

<img src="data:image/jpeg;base64,' + base64imageReturnedWithAjax + '">')
这会在控制台中生成以下错误:

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中)检索和发送文件的webmethod。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

内联base 64可以很好地处理图像(只要它们很小),因此您可能在这方面做得对。但是,我认为对于PDF或大多数其他BLOB(SQL Server中的
varbinary(max)
),您并没有走上正确的道路

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

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

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

HTTP处理程序示例 我将一些生产代码精简为处理PDF的部分。这应该是最小的修改工作

首先在VisualStudio中将通用处理程序添加到项目中。它将有一个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;
        }
    }
}

要调用此代码,您可以简单地链接到它,例如
。您还可以将此代码放入ASPX页面中,并触发它以响应按钮单击、页面事件等。

如果我遵循您的目标,那么问题不在于解码,而在于javascript无法触发下载。这是因为它无法向浏览器(自身)发送内容处置http头

您可以执行以下操作之一(我可以想到):

  • 使用传统的
    对象
    元素嵌入PDF。您可以使用jquery动态地生成它。并将对象源URL设置为
    数据:
    URI

  • (这只是一个理论),您可以使用
    window.location.assign('data:xxx
    )将用户带到PDF或触发下载,具体取决于没有内容处理的PDF的处理方式


  • 但是,我非常确定,如果ajax请求在响应头中获得了
    download
    的内容配置,它将冒泡出现,并且向用户提供下载选项,这将消除对数据模式的需要。

    Hi Tim,正如您所建议的,所有图像当前都在单个JSON对象中提供,很高兴知道这是一种可接受的做法。我将阅读一些关于HTTP处理程序和Response.BinaryWrite()的文章,看看我的进展如何,这些词目前对我来说是陌生的!谢谢你的帮助,我给了你一票,但是我会等着投票给你正确的答案,直到我读了足够多的书,确信你是正确的(我几乎肯定你是正确的)!我一直在试图找到一个为PDF服务的HTTP处理程序的好例子(我一直都在这样做)。我能找到的最接近的例子是我自己的一个项目中为你添加了一个真实的例子。
    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;
            }
        }
    }