【问题标题】:Http Post image fails in browser/Ripple emulatorHttp Post 图像在浏览器/Ripple 模拟器中失败
【发布时间】:2015-09-07 14:21:34
【问题描述】:

我正在编写一个小型 Cordova (PhoneGap) 应用程序。即从文件输入发送图像 - 使用 post 方法。它在我的 Android 设备上运行良好,但在 broswer 和 Ripple 模拟器中都失败了。代码如下:

function queryImageByData(dataURL) {

    var imgType = dataURL.substring(5, dataURL.indexOf(";"));
    var imgExt = imgType.split("/")[1];
    var imgData = atob(dataURL.substring(dataURL.indexOf(",") + 1));

    var filenameTimestamp = (new Date().getTime());

    var separator = "----------12345-multipart-boundary-" + filenameTimestamp;
    var formData = "--" + separator + "\r\n" +
    "Content-Disposition: file; name=\"file\"; filename=\"snapshot_" + filenameTimestamp + "." + imgExt + "\"\r\n" +
    "Content-Type: " + imgType + "\r\nContent-Transfer-Encoding: base64" + "\r\n\r\n" + imgData + "\r\n--" + separator + "\r\n";


    var xhr = new XMLHttpRequest();


    xhr.sendAsBinary = function (data) {
        var arrb = new ArrayBuffer(data.length);
        var ui8a = new Uint8Array(arrb, 0);
        for (var i = 0; i < data.length; i++) {
            ui8a[i] = (data.charCodeAt(i) & 0xff);
        }

        var blob = new Blob([arrb]);
        this.send(blob);
    };


    xhr.open("POST", "https:/my_endpoint_here", true);
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
            if (xhr.status == 200) {
                parseResult(xhr.responseText);
            }
            else {
                onFailedResponse(xhr.responseText);
            }
        }
    };

    xhr.setRequestHeader("Content-type", "multipart/form-data; boundary=" + separator);
    xhr.sendAsBinary(formData);
}

我得到的错误是:

Error: MultipartParser.end(): stream ended unexpectedly: state = HEADER_FIELD_START
    at MultipartParser.end

编辑:

我的 get 方法也有问题。它在 Ripple/Browser 上失败,但在设备上运行正常。这是一些示例代码:

var url = document.getElementById("urlInput").value;

    var query = "my_url_here";     
    var jqxhr = $.ajax(query)
  .done(function (data) {
      alert("success" + data);
  })
  .fail(function (data) {
      alert("error" + data);
  })

【问题讨论】:

    标签: javascript cordova http post xmlhttprequest


    【解决方案1】:

    我找到了核心问题,即跨域调用。 浏览器不允许这样做,Ripple 模拟器显然也是如此, 但移动设备确实允许。 现在我只需要弄清楚如何使用CORS 使其工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-07
      • 2019-05-23
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多