与之前上传的Chrome扩展程序抓取文件(Grab file with chrome extensi

2019-06-26 11:54发布

用我的Chrome扩展我想抓住一个文件(也许改变它)之前被上传到网站。 特别是从文件输入。 换句话说,如果我选择一个输入[type = file]我希望我的浏览器扩展程序中断任何提交,并采取文件的文件。 然后我的扩展应用其神奇的文件,该文件可提交后/上传。 我该如何处理这个?

在出现问题时使用的文件路径。 如果我抓住一个文件输入的vaule它总是更改为“C:\ fakepath \”的实际路径由于HTML5标准和兼容性问题。 我如何可以访问该文件呢? 也许是在一些铬存储暂时保存?

编辑:嗯,我设法读取这样的文件输入选择的文件:

var file;
$('input[type=file]').change(function(e){
    file = e.target.files[0];
    var reader = new FileReader();      
    reader.onload = function (event) {
        console.log(event.target.result);  //contains the file data
        //maybe change data and use filewriter  

    };      
    reader.readAsDataURL(file);
};

现在我想用一个FileWriter写入e.target.files [0]

我跟着这个教程: http://www.html5rocks.com/en/tutorials/file/filesystem/但我不能够创造一个合适的FileWriter。

这是没有必要写入到磁盘上的原始文件 - 甚至可能不可能的 - 但我需要更改使用在相应的文件,输入表单字段上传数据。

Answer 1:

有用于浏览器扩展拦截的请求(的有效负载没有定义的API 中的工作 )。

话虽这么说,你可以使用内容脚本添加事件监听器:

  1. 取消正常的表单提交。
  2. 读取文件作为ArrayBuffer使用FileReader API。
  3. 修改导致ArrayBuffer在其包装后视图 。
  4. 创建一个Blob从修改后的数据。
  5. 通过创建一个重构的形式FormData例如,然后使用.append(name, value[, filename])方法。
    注:在下面的例子中,我并没有包括的形式重建方法。 我只包括文件上传部分。 有重建形式两种方法:

    1. 写这是特定于表单的方法。
    2. 写一般形式的解析方法,它无名/残疾/选中/ ...元素的照顾。 如果你想利用这条航线,看看在W3规范的表单提交算法 。
  6. 提交数据使用XMLHttpRequest 。 注意:如果你正在运行在您的浏览器扩展的背景下,这个代码,不要忘记在明确列入白名单网址permissions清单文件部分 。

下面是实现的一个例子:

// Reference to the form:
var form = document.forms["uploadForm"];
form.addEventListener('submit', function(ev) {
    ev.preventDefault(); // Cancel submission

    var fileInput = form.querySelector('input[type="file"]');
    var file = fileInput.files[0];
    if (!file) return; // No file selected

    var fileReader = new FileReader();
    fileReader.onload = function() {
        var arraybuffer = fileReader.result;
        // To manipulate an arraybuffer, wrap it in a view:
        var view = new Uint8Array(arraybuffer);
        view[0] = 0; // For example, change the first byte to a NULL-byte

        // Create an object which is suitable for use with FormData
        var blob = new Blob([view], {type: file.type});

        // Now, the form reconstruction + upload part:
        var formData = new FormData();
        formData.append(fileInput.name, blob, file.name);
        // ... handle remainder of the form ...

        // Now, submit the form
        var xhr = new XMLHttpRequest();
        xhr.open('POST', form.action);
        xhr.onload = function() {
            // Do something. For example:
            alert(xhr.responseText);
        };
        xhr.onerror = function() {
            console.log(xhr); // Aw. Error. Log xhr object for debugging
        }
        xhr.send(formData);
    };
    fileReader.readAsArrayBuffer(file);
});


文章来源: Grab file with chrome extension before upload