用我的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。
这是没有必要写入到磁盘上的原始文件 - 甚至可能不可能的 - 但我需要更改使用在相应的文件,输入表单字段上传数据。
有用于浏览器扩展拦截的请求(的有效负载没有定义的API 中的工作 )。
话虽这么说,你可以使用内容脚本添加事件监听器:
- 取消正常的表单提交。
- 读取文件作为
ArrayBuffer
使用FileReader
API。 - 修改导致
ArrayBuffer
在其包装后视图 。 - 创建一个
Blob
从修改后的数据。 通过创建一个重构的形式FormData
例如,然后使用.append(name, value[, filename])
方法。
注:在下面的例子中,我并没有包括的形式重建方法。 我只包括文件上传部分。 有重建形式两种方法:
- 写这是特定于表单的方法。
- 写一般形式的解析方法,它无名/残疾/选中/ ...元素的照顾。 如果你想利用这条航线,看看在W3规范的表单提交算法 。
- 提交数据使用
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);
});