3

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 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));
?>
2
  • What is the error your having? What part doesn't work? What does work? Commented Mar 23, 2011 at 2:15
  • no errors. if I put an onload function in it executes, responseText is blank (should contain some html) Commented Mar 23, 2011 at 3:14

1 Answer 1

2

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);
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.