将文件选择器数据存储在隐藏的输入中

Posted

技术标签:

【中文标题】将文件选择器数据存储在隐藏的输入中【英文标题】:Storing file chooser data in a hidden input 【发布时间】:2021-01-17 11:37:22 【问题描述】:

为了个人方便,我正在使用一个名为 TamperMonkey 的工具来修改网页。 TamperMonkey 允许您通过在页面加载后将 javascript 附加到页面来修改客户端 html 等。

该网页有一个文件选择器,但它不允许您拖放文件。我经常使用这个网页,所以拖放功能真的很有帮助。

此页面有一个文件输入类型的表单。我一直在阅读,出于安全原因,无法修改文件输入类型。但是,使用 TamperMonkey,我可以将文件选择器的输入类型更改为“隐藏”,然后将隐藏的输入值设置为我放在网页上的文件内容,对吗?据我了解,服务器无法区分(如果name 属性相同)。

我不知道如何将隐藏输入类型设置为与文件选择器相同的数据

我的文件在这里:const file = e.originalEvent.dataTransfer.files[0];

我通过这样做获得了隐藏的输入类型:const hiddenField = $("iframe").contents().find(".file-input").attr('type','hidden')

我只是不知道如何将file 设置为hiddenField。这个值应该是 base64 编码的吗?一个斑点?无论如何,什么代码可以正确设置数据?

它的包装形式如下:

<form ... method="post" enctype="multipart/form-data">

替代建议的重要上下文:在您单击按钮之前,此文件选择器输入根本不在页面上。然后它会显示在 iframe 中。

我正在使用火狐。

【问题讨论】:

你能分享更多代码吗?甚至是网站的网址? @Goldwave 我无法共享该网站。如果您告诉我您还需要什么,我可以分享代码。 您是否尝试将文件拖到选择按钮上? “选择要上传的文件”按钮。还是没有这种东西? @Goldwave 它不起作用。选择按钮在弹出窗口中,我必须在它出现之前单击一些东西。 一些想法。 1)在 document.body 上的 dragover 事件中,更改现有文件输入的样式,使其覆盖整个页面,例如添加一个巨大的透明边框并使用绝对定位 + z-index 2) 替换页面的提交事件并使用 FormData API 自己构建有效负载,该 API 可以直接使用文件 blob,您将从 drop 中的文件内容中读取该文件 blob事件处理程序。 【参考方案1】:

可以使用 Tampermonkey 修改文件输入类型。

如果您无法立即add drag and drop support to the input 本身,您可以使用另一个 dom 元素实现拖放,并如下使用它们。

const dT = new ClipboardEvent('').clipboardData || // Firefox < 62 workaround exploiting https://bugzilla.mozilla.org/show_bug.cgi?id=1422655
new DataTransfer(); // specs compliant (as of March 2018 only Chrome)

dT.items.add(new File([dataURItoBlob(image)], '1.jpg',  type: 'image/jpeg' ));
dT.items.add(new File([dataURItoBlob(image2)], '2.jpg',  type: 'image/jpeg' ));

// then ...
// $("iframe").contents().find(".file-input").get(0).files = dT.files;

That snippet of code 已经过测试,在类似的设置中,文件输入在单击按钮后动态附加到页面。使用不同的 div 将图像拖放到页面上。

【讨论】:

我已经有了文件:const file = e.originalEvent.dataTransfer.files[0]; 我将尝试使用你答案的最后一行。 最好链接到 where 你选择一半的代码...

以上是关于将文件选择器数据存储在隐藏的输入中的主要内容,如果未能解决你的问题,请参考以下文章

如何将用户输入存储在数据库中?

Visual Studio 在编译文件中存储隐藏数据?

c++如何用文件流将数据存储到一个TxT文件中

无法将输入从 JTextField 存储到文件写入器

使用 Windows 资源管理器获取要存储在表中的文件的路径(字符串)

Oracle存储过程在SSRS查询设计器中不起作用