我在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个字符/行,并去除+和其他特殊字符。
希望能有所帮助。