2

我正在构建一个供内部使用的 Chrome 扩展程序,用户可以一步上传文件。这始终是同一个文件,我想跳过浏览对话框并直接为输入字段分配正确的值。

该文件与插件代码分开。

这是否可以通过 Javascript 或开发 Chrome、Firefox 扩展来实现?

我努力了:

input.val("file://C:/random.txt")

然后提交周围的表格。但这没有用。

4

2 回答 2

2

火狐:

根据这个答案,你想要的似乎是可能的,但我没有仔细调查过。

铬合金:

NPAPI 插件之外,这绝对是不可能的。您的浏览器无法访问文件系统,除非用户通过文件对话框明确要求它这样做。如果 Web 上的任何页面能够以编程方式设置文件路径,然后在用户单击表单按钮时获取文件,那将引发巨大的安全问题。

所以,很明显,一个普通的网页肯定做不到。如果 Chrome 扩展程序可以做到这一点(即读取文件系统中的任何文件),那么它至少需要特殊权限。权限列表不包括文件系统访问,所以这是不可能的。

正如我在开头提到的,唯一的选择是开发一个 NPAPI 插件来为您读取文件,这就像建造一家医院来治疗青春痘一样。NPAPI 具有相当陡峭的开发学习曲线,并且引入了重大的安全问题(由于您的扩展现在可以充当本地用户,因此安全妥协的成本要高得多)。

如果您愿意将文件放在浏览器的虚拟 HTML5 文件系统上,那么您可以这样做。如果没有具体了解您的需求,我不能说这是否适合您。

于 2012-11-09T17:56:23.740 回答
2

如果您的目标是将文件发送到服务器,那么尝试在字段中选择它是错误的方式 - 您可以直接<input>创建一个FormData对象并通过XMLHttpRequest. FormData请注意,您还可以从现有表单创建对象。这适用于 Firefox 和 Chrome,甚至适用于网页(当然,通常适用同源限制)。

棘手的部分是获取一个可以添加到表单数据的File对象。据我所知,除了使用 NPAPI 插件之外,Chrome 扩展程序没有直接的文件系统访问权限——因此它们无法从用户的磁盘驱动器中获取文件,它们只能使用一些数据创建一个 blob。然而,Firefox 扩展具有允许它们通过路径创建对象的File构造函数。File

So in Firefox you would do something like this:

var formdata = new FormData();
formdata.append("file", new File("file://C:/random.txt"));

var request = new XMLHttpRequest();
request.open("POST", "http://my.server/submitFile");
request.send(formdata);
于 2012-11-09T17:59:29.937 回答