我在javascript中有一个base64编码的jpg,我想将其发布到需要multipart/form-data的服务器上。

具体来说,对于枢轴跟踪器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并发送它,就好像我已经以表格形式上传了文件一样。

有任何想法吗?

最佳答案

非常坦率的。我像您一样使用JQuery尝试过,但无法完成。因此,我继续构建自己的XHR实现,该实现将自定义的多部分主体发送到服务器。

1)初始化您的XHR
2)一起建立多部分的 body
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个字符/行,并去除+和其他特殊字符。

希望能有所帮助。

10-05 20:57
查看更多