I'm trying to upload an image via POST with javascript to a site that I can't modify the source of.
The page has a form that allows you to upload images:
<form enctype="multipart/form-data" action="/u.php" method="post">
<input name="file" type="file"> <input type="submit" value="Upload File">
</form>
I want to be able to upload images with javascript but I can't get anything to work, I'm not sure if this is even开发者_StackOverflow possible...
My JS so far:
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')); }
Thanks
EDIT: figured this one out, kind of, this should work with a little modification (png is hardcoded in)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]); }
test PHP:
<? echo sprintf('<pre>%s</pre>', print_r($_FILES, true)); ?>
Actually, have you tried xhr.send(FormData)
? FormData allows you to
append File objects, which will be treated as binary content and using
it with XHR sends a multipart/form-data. There's no need to construct it yourself.
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);
精彩评论