javascript - 从 chrome 扩展上传到 php $_FILE

标签 javascript html google-chrome google-chrome-extension

我正在尝试使用 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));
?>

最佳答案

实际上,您是否尝试过xhr.send(FormData)? FormData 允许您 追加文件对象,这将被视为二进制内容并使用 它使用 XHR 发送多部分/表单数据。没有必要自己构建它。

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);

关于javascript - 从 chrome 扩展上传到 php $_FILE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5399520/

相关文章:

html - 将 Div 宽度设置为无边距页面宽度的 20%

macos - 是否可以将 Google Chrome Canary 设置为 OS X Yosemite 上的默认浏览器?

javascript - :contains case insensitive solution does not work when text is replaced for highlighting

javascript - 刷新 AjaxPOST 数据表上的 CSRF token : CodeIgniter

html - margin : auto is not centering my div even though width is set

google-chrome - 来自 Google Chrome 中用户脚本的跨源 XHR

仅 CSS 文本子菜单(在 sprite 菜单下)仅在 chrome/safari 中未对齐

javascript - 如何执行将 JS 函数作为字符串传入而不使用 eval 的函数调用?

javascript - 如何分析 node.js 中的传出 http 请求?

jquery - setTimeout 函数无法正常工作