将base64图片转换为multipart/form-data格式并使用jQuery发送

8

我在javascript中有一个base64编码的jpg图片,我想将其发送到一个期望multipart/form-data格式的服务器。

具体来说,是发送到Pivotal Tracker API,它有一个如下的curl调用示例:

curl -H "X-TrackerToken: TOKEN" -X POST -F Filedata=@/path/to/file \
http://www.pivotaltracker.com/services/v3/projects/PROJECT_ID/stories/STORY_ID/attachments

我已经成功使用 .ajax 实现了基本的与其API交互的XML调用,代码如下:

$.ajax({
  url: 'http://www.pivotaltracker.com/services/v3/projects/158325/stories',
  type: 'POST',
  contentType: 'application/xml',
  dataType: 'xml',
  beforeSend: function(xhr) {
    xhr.setRequestHeader("X-TrackerToken", "<KEY>")
  },
  data: '<story><story_type>feature</story_type><name>Fire torpedoes</name></story>',
  success: function() { alert('PUT completed'); }
});

但是我不知道该如何将我的 base64 编码的 jpg 文件发送,就像我在表单中上传文件一样。

有什么想法吗?

2个回答

4
你只需要将base64数据转换为blob并通过FormData发送即可。
function b64toBlob(b64Data, contentType, sliceSize) {
            contentType = contentType || '';
            sliceSize = sliceSize || 512;

            var byteCharacters = atob(b64Data);
            var byteArrays = [];

            for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
                var slice = byteCharacters.slice(offset, offset + sliceSize);

                var byteNumbers = new Array(slice.length);
                for (var i = 0; i < slice.length; i++) {
                    byteNumbers[i] = slice.charCodeAt(i);
                }

                var byteArray = new Uint8Array(byteNumbers);

                byteArrays.push(byteArray);
            }

          var blob = new Blob(byteArrays, {type: contentType});
          return blob;
}


function imagetoblob(ImgId){
    var ImageURL = document.getElementById(ImgId).getAttribute('src');
    // Split the base64 string in data and contentType
    var block = ImageURL.split(";");
    // Get the content type of the image
    var contentType = block[0].split(":")[1];// In this case "image/gif"
    // get the real base64 content of the file
    var realData = block[1].split(",")[1];// In this case "R0lGODlhPQBEAPeoAJosM...."

    // Convert it to a blob to upload
    return b64toBlob(realData, contentType);
}

在您的表单数据中
formData.append("image", imagetoblob('cropped_image'));

4

非常直接。我像你一样尝试使用JQuery,但是无法完成它。所以我开始构建自己的XHR实现,它将向服务器发送自定义的多部分主体。

1)初始化您的XHR 2)组合多部分主体 3)发送它

var xhr  = new XMLHttpRequest();
...
xhr.open("POST", url, true);

var boundary = '------multipartformboundary' + (new Date).getTime(),
dashdash = '--',
crlf = '\r\n',

这就是魔法发生的地方。你需要为传输构建自己的“主体”,并将图像数据作为普通变量与名称一起放入主体中:
content = dashdash+boundary+crlf+'Content-Disposition: form-data; name="NAMEOFVARIABLEINPHP";"'+crlf+crlf+VARIABLEWITHBASE64IMAGE+crlf+dashdash+boundary+dashdash+crlf;

然后只需发送它:
xhr.setRequestHeader("Content-type", "multipart/form-data; boundary="+boundary);
xhr.setRequestHeader("Content-length", content.length);
xhr.setRequestHeader("Connection", "close");
// execute
xhr.send(content);

如果您使用PHP,您的$_POST中会有一个包含base64编码字符串的新变量。这将防止浏览器将该字符串分成72个字符/行,并剥夺“+”和其他特殊字符。
希望对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接