【问题标题】:jQuery.ajax() gives broken image data?jQuery.ajax() 给出损坏的图像数据?
【发布时间】:2017-03-20 18:16:21
【问题描述】:

我正在尝试通过 jQuery.ajax() 将 AJAX 调用添加到 Phantomjs 获取的页面以下载附加图像 /myfile.jpg:

var result = page.evaluate(function() {

    var out;
    $.ajax({
        'async' : false,
        'url' : '/myfile.jpg',
        'success' : function(data, status, xhr) {
            out = data;
        }
    });
    return out;

});

fs.write('myfile.jpg', result, 'wb');

数据似乎已成功下载并保存到本地文件myfile.jpg,但它是一个损坏的图像,根本无法打开。

文件大小似乎正确,但我不确定。 Notepad++ 文本编辑器中打开的内容不是文本,而是大量无法识别的字符或字节。

我在这里做错了什么?

【问题讨论】:

  • 为什么需要这样做?通过 AJAX 下载文件充其量是非常不稳定的,而在最坏的情况下则是一个坏主意——尤其是在处理二进制文件类型时。您还应该删除async: false 设置。如果您检查控制台,您甚至会看到来自浏览器的有关其使用的警告。
  • 您在问题中同时提到了.jpg.png。您是否在某个阶段以错误的格式保存文件?
  • 为什么不简单地$('img').attr('src', '/myfile.jpg')
  • “在 Notepad++ 文本编辑器中打开的内容不是文本,而是大量无法识别的字符或字节” - 它是二进制文件。您打开一个图像文件。你期望得到什么?
  • 这很令人困惑,您正在使用 ajax 下载二进制图像文件,这是……错误,然后您说您在 Notepad++ 中打开文件并且它不是文本,只是 “无法识别的字符或字节”,你期待什么,这是一个二进制文件?

标签: jquery ajax image binary phantomjs


【解决方案1】:

您需要改用download 函数。
http://docs.casperjs.org/en/latest/modules/casper.html#download

但是,如果文件大小超过 7MB,您可能会 won't be able 下载文件。

您还可以将 PhantomJS 与 Download support 一起使用(通过 Vitallium

【讨论】:

  • 另外:如果有一些基于 cookie 的服务器身份验证,将无法使用 CasperJS 下载文件。
  • 有没有关于如何使用download support 的文档?我想我必须手动编译下载支持版本?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
相关资源
最近更新 更多