我有一个javascript应用程序,它将ajax POST请求发送到某个URL.响应可能是JSON字符串,也可能是文件(作为附件).我可以在我的ajax调用中轻松检测Content-Type和Content-Disposition,但是一旦我检测到响应包含文件,我该如何让客户端下载它?我在这里读过很多类似的帖子,但没有一个提供我正在寻找的答案.
请,请不要发布答案,建议我不应该使用ajax或者我应该重定向浏览器,因为这都不是一个选项.使用纯HTML表单也不是一种选择.我需要的是向客户端显示下载对话框.可以这样做,怎么做?
编辑:
显然,这不可能做到,但有一个简单的解决方法,如接受的答案所示.对于今后遇到这个问题的人来说,我的解决方法如下:
__PRE__
所以基本上,只需生成一个HTML表单,其中包含与AJAX请求中使用的相同的参数并提交它.
我想使用jQuery异步加载我的页面上的外部图像,我尝试了以下内容:
$.ajax({ 
   url: "http://somedomain.com/image.jpg", 
   timeout:5000,
   success: function() {
   },
   error: function(r,x) {
   }
});
但它总是返回错误,甚至可以像这样加载图像?
我尝试使用.load方法并且它可以工作,但我不知道如果图像不可用我怎么能设置超时(404).我怎样才能做到这一点?
我允许用户通过拖放和其他方法将图像加载到页面中.删除图像时,我正在使用URL.createObjectURL转换为对象URL来显示图像.我没有撤销网址,因为我重复使用它.
所以,当谈到时间来创建一个FormData对象,所以我可以让他们上传的形式,在它的形象之一,是有一些方法,然后我可以扭转这一目标URL回一个Blob或File因此我可以将其添加到FormData宾语?
使用内容安全策略时,我尝试使用window.URL.createObjectURL关注Chrome 41(测试版)中的过程,我收到如下错误:
拒绝从'blob:http%3A // localhost%3A7000/f59612b8-c760-43a4-98cd-fe2a44648393'加载插件数据,因为它违反了以下内容安全策略指令:"object-src blob://*"
使用内容安全策略限制object-src或以其他方式default-src可以重现问题(为方便起见使用jQuery),如下所示:
blob = new Blob(
   ["%PDF-1.\ntrailer<</Root<</Pages<</Kids[<</MediaBox[0 0 3 3]>>]>>>>>>"],
   { type: "application/pdf" })
$("<embed>").attr("src", window.URL.createObjectURL(blob))
  .appendTo(document.body)
从规范看来,这应该起作用,就像它一样data://*.我曾尝试也blob,blob:,blob:*,blob:http*,blob:http:*,blob:http://*,但无济于事.
什么工作,但由于明显的原因是不可取的,是object-src *.
有没有人在使用内容安全策略加载blob方面有什么成功?这是上游的问题,还是我忽略了什么?
我正在使用这个
        $.ajax({
            type: "GET",
            url: 'template/bump1/purse.png',
            datatype:"image/png",
            success: function (data) {
                var reader = new FileReader();
                reader.onload = function (e) {
                  var img = document.getElementById("CaptchaImg");
                  img.src = e.target.result;
                };
                reader.readAsDataURL(data);
                //$('#CaptchaImg').attr('src', data);
            }
         });
下载图像,它以二进制形式出现,看起来像这样
node.js将其返回为
                        WriteHeaderMode('image/png', res, 200);
                        res.end(data, 'binary');
但现在,我如何将其放入图像标记并将其显示为图像.注:我不希望有回报数据base64编码,它必须是二进制.我很好,在客户端将二进制文件转换为base64.
当我把它传递给它时readAsDataURL,它说TypeError异常.
谢谢
编辑
                var img = document.getElementById("CaptchaImg");
                  var reader = new FileReader();
                  reader.onload = function(e) {
                      //img.src = e.target.result;
                      $("body").html(e.target.result);
                    };
                  reader.readAsDataURL(new Blob([data]));
这似乎将它转换为base64编码,它开始data:application/octet-stream;base64,但不显示图像...
是否可以将多个文件从url下载到一个创建的文件夹中或作为zip文件下载?
我目前正在下载给定网址的文件,如下所示:
        var download_url = ""; 
        window.location.href = download_url;
如果我要使用一系列网址,则可以执行以下操作:
for each url in urls
   window.location.href = url;
这可行,但是会导致在downloads文件夹中生成单个下载的文件。这可能是混乱的。
是否可以创建并指定下载所有文件的文件夹或将所有下载的文件转换为zip文件?