【问题标题】:image data response from jquery .ajax into new ajax call?来自 jquery .ajax 的图像数据响应到新的 ajax 调用?
【发布时间】:2016-10-21 19:44:33
【问题描述】:

我正在尝试将ImageOptim APIOCR.space API 链接在一起。 顺便说一句,两个很棒的 AP​​I,我强烈推荐它们!但目前的问题是 OCR api 不接受免费层中超过 1 mb 或 2600x2600 px 的图像,因此许多来源需要在发送之前进行优化。

我正在从一个 Cordova 包装的 html 文件运行这个对 ImageOptim 的 jQuery ajax 调用:

var compress = function(image) {
console.log("starting compress");
$.ajax({
    url: "https://im2.io/eX4mp1E4pI/2600x2600,quality=low",
    method: "POST",
    data: {
        file: image
    },
    processData: false,
    contentType: false,
    crossDomain: true
}).done(function(res) {
    window.compressedImg = res;
    formData.append("file", res);
    runOCR();
}).fail(function(jqXHR, textStatus) {
    console.log("Request failed: " + textStatus);
});
}; 

请注意:

  1. 这(根据我的经验)将在浏览器中失败,因为跨域调用在浏览器中被阻止但不是来自科尔多瓦。
  2. 尚未添加 OCR 兼容压缩(但需要文件大小和维度参数)

此调用的输出是作为字符串的原始 png,即在文本编辑器中打开 .png 文件时得到的结果。我已经尝试了很多方法来处理这个问题,但无法理解如何在下一个 ajax 调用(如下)中使用这些数据,是否需要将其保存到磁盘然后上传,如果是这样 - 如何? (因为我尝试将其写入 localstorage 但仍会被视为字符串)。

OCR.space 调用;

var formData = new FormData();
formData.append("language", "MYLANGUAGE");
formData.append("apikey", "MYAPIKEY");
formData.append("isOverlayRequired", false);
function runOCR2() {
jQuery.ajax({
    url: 'https://api.ocr.space/parse/image',
    data: formData,
    dataType: 'form/multipart',
    cache: false,
    contentType: false,
    processData: false,
    method: 'POST',
    success: function(ocrParsedResult) {
        console.log(ocrParsedResult);
    }
});
}

请注意;这里没有设置变量,但为了清楚起见,我将它们放在一起。

此调用的响应是:

responseText: "{\"ParsedResults\":null,\"OCRExitCode\":99,\"IsErroredOnProcessing\":true,\"ErrorMessage\":\"No file uploaded or UR…"

即调用有效,但 image 参数不是有效的图像。

关于如何处理返回的字符串以便将其作为图像读取以供下一次 api 调用的任何想法?

【问题讨论】:

    标签: javascript jquery ajax image


    【解决方案1】:

    通常当您使用 formData 上传文件时,您只需传递文件引用,例如 form.append('myfile',$("#fileInput").files[0]) 和浏览器处理屏幕后面的编码。它手动将文件转换为字节流并准备适当的边界以帮助服务器区分图像的开始和结束位置

    但是这里的情况不同,你没有将文件绑定到任何物理文件控件,而是动态创建的,你会得到一个字节流。考虑到上述事实,你需要明确地告诉浏览器 它是一个独立的原始二进制文件,应该这样对待

    Blob 对象表示不可变的原始数据的类似文件的对象。 Blob 表示不一定是 JavaScript 原生格式的数据。

    var blob = new Blob([res], {type : 'image/png'}); //res is the converted image ImageOptim API
    
    var formData = new FormData();
    var fileName = 'myimage.png';    //filename that server will see it as
    formData.append('anything', blob, fileName);
    formData.append("language", "MYLANGUAGE");
    formData.append("apikey", "MYAPIKEY");
    formData.append("isOverlayRequired", false);
    
    function runOCR2() {
        $.ajax({
          url: "https://api.ocr.space/parse/image",
          type: "POST",
          cache: false,
          contentType: false,
          processData: false,
          data: formData,
          success: function(response){alert(response);}
        }); 
    }   
    

    【讨论】:

    • 这非常接近...我发现 github.com/acigna/jquery-ajax-native 添加了响应类型支持以支持 blob,但您的解决方案似乎已经过时了;您的解决方案失败的地方是上传文件的规范。在您的初始解决方案中,没有为选项“file”传递任何参数,将“anything”更改为“file”会导致错误,删除 filename 参数会导致错误,因为图像没有有效的扩展名
    • 添加 var fileOfBlob = new File([blob], fileName); formData.append('file', fileOfBlob);使 blob 成为一个应该可以“按原样”发送的文件 - 在控制台中它看起来不错,但我仍然从 API 中收到一个错误,即文件大小必须大于 0
    • 在传统形式中,<file name='myfile>` 控制您传递的内容,因为 name 正是“任何东西”,它只是发布数据的信封标记,但服务器将看到的文件名该文件由fileName 给出。我不知道你是否使用php,但服务器上的$_FILES aray 会像这样Array ( [anything] => Array ( [name] => myimage.png [type] => image/png [tmp_name] => /tmp/phpJvSJ94 [error] => 0 [size] => 950 ) ) 我不知道为什么会出错
    • yes File 是 Blob 的子对象,有“更多”的东西可能是可能的
    • 尝试更改顺序,先附加身份验证数据,然后调整一些 ajax 选项的图像
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 2015-05-13
    相关资源
    最近更新 更多