Http Post图像在浏览器/ Ripple仿真器中失败

时间:2015-06-22 08:01:15

标签: javascript cordova http post xmlhttprequest

我正在写一个小型的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);
  })

1 个答案:

答案 0 :(得分:0)

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