我正在尝试使用带有javascript的POST上传图片到我无法修改源代码的网站。
该页面有一个允许您上传图像的表格:
<form enctype="multipart/form-data" action="/u.php" method="post">
<input name="file" type="file"> <input type="submit" value="Upload File">
</form>
我希望能够使用javascript上传图片,但我无法正常工作,我不确定这是否可能......
我的JS到目前为止:
file = document.getElementById('fileinput').files[0]; r = new FileReader(); r.onloadend = doUpload; r.readAsBinaryString(file) function doUpload(el){ file = el.target.result; XMLHttpRequest.prototype.sendAsBinary = function(string) { var bytes = Array.prototype.map.call(string, function(c) { return c.charCodeAt(0) & 0xff; }); this.send(new Uint8Array(bytes).buffer); }; var xhr = new XMLHttpRequest(); xhr.open('POST', 'http://upload.domain.com/u.php', true); var boundary = 'ohaiimaboundary'; xhr.setRequestHeader( 'Content-Type', 'multipart/form-data; boundary=' + boundary); xhr.sendAsBinary([ '--' + boundary, 'Content-Disposition: form-data; name="file"; filename="test.jpg"', 'Content-Type: multipart/form-data', '', file, '--' + boundary + '--' ].join('\r\n')); }
由于
编辑:
想出这个,有点,这应该稍加修改(png是硬编码的)
function doUpload(fl){ var file = fl.target.result; XMLHttpRequest.prototype.sendAsBinary = function(datastr) { var bb = new BlobBuilder(); var data = new ArrayBuffer(1); var ui8a = new Uint8Array(data, 0); for (var i in datastr) { if (datastr.hasOwnProperty(i)) { var chr = datastr[i]; var charcode = chr.charCodeAt(0) var lowbyte = (charcode & 0xff) ui8a[0] = lowbyte; bb.append(data); } } var blob = bb.getBlob(); this.send(blob); } var xh = new XMLHttpRequest(); xh.open('post', 'http://upload.domain.com/u.php', true); xh.onreadystatechange = function(){ if(this.readyState != 4){ return; } else{ console.log(this.responseText); } }; var boundary = '--fgsfds--'; xh.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary); xh.sendAsBinary([ '--' + boundary, 'Content-Type: image/png', 'Content-Disposition: form-data; name="file"; filename="testz.png"', '', file, '--' + boundary + '--', ''].join('\n')); } function mkUpload(){ var r = new FileReader(); r.onloadend = doUpload; r.readAsBinaryString(document.upload.file.files[0]); }
测试PHP:
<? echo sprintf('<pre>%s</pre>', print_r($_FILES, true)); ?>
答案 0 :(得分:1)
实际上,你试过xhr.send(FormData)
吗? FormData允许您
追加File对象,它将被视为二进制内容并使用
它与XHR一起发送multipart / form-data。没有必要自己构建它。
var formData = new FormData();
var file = document.querySelector('input[type="file"]').files[0];
if (file) {
formData.append("file", file);
}
var xhr = new XMLHttpRequest();
xhr.open('POST', '/u.php', true);
xhr.onload = function(e) { ... };
xhr.send(formData);