【发布时间】: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事件处理程序。
标签: javascript html jquery firefox tampermonkey