我正在 Angular 项目中开发文件上传功能,用户可以使用 元素上传特定文件。
这些是该功能的 html 和 css 代码片段:
<label for="fileUpload" class="custom-file-upload">Load Parameters File</label>
<input type="file" id="fileUpload" style="display:none;" accept=".json,.xml">
.custom-file-upload {
display: flex;
cursor: pointer;
background-color: #1c3849;
color: white;
border-radius: 6px;
border: 1px solid black;
box-sizing: border-box;
align-items: center;
justify-content: center;
font: 15px "Noto Sans Display", sans-serif;
font-weight: normal;
width: 200px;
height: 50px;
margin: 0;
}
.custom-file-upload:hover {
background-color: #006e9e;
}
我希望单击“选择文件”时打开的文件资源管理器验证以下条件:
期望的结果: 我正在寻找任何可以实现以下功能的解决方案(HTML、JavaScript 或其他):
对于默认目录和文件夹限制:我已经研究了文件系统访问API,但它似乎并不完全允许设置默认目录或以符合我的需求的方式限制用户访问。
对于文件类型强制:虽然接受属性在一定程度上限制了文件类型,但用户仍然可以通过在文件选择器对话框中手动选择“所有文件”来绕过此限制。
看起来文件系统访问 API 将允许您更好地控制您想要的内容。
<input>
标签受到更多限制,因此我建议使用带有 onclick
事件的按钮或其他标签。
首先,您可以通过将
excludeAcceptAllOption
设置为 true 来禁用其他类型的文件。
其次,我们可以使用
startin
功能从给定目录开始。这可以是保存的目录或某种默认目录,例如大多数操作系统上都存在的“Home”。
对于最后一个要求,不幸的是,不可能限制用户导航到其他目录或重命名文件的能力,因为这是大多数/所有操作系统的默认功能。
对于
<input type='file'>
方法,这只具有here所述的少数属性。问题是这些属性都无法控制重命名或浏览,甚至无法查看您已单击但未决定选择哪些文件。
对于文件系统访问 API,也没有类似的内容,因为所有文件选择器选项都在 here 提供,并且与此无关。
阻止鼠标右键文件重命名或查看光标所在位置以阻止其移动到另一个目录等间接方法也行不通。这是因为在文件选择器中无法检测到鼠标移动、单击和所有其他用户输入。如果您创建用于键入或单击的事件侦听器,它将无响应,因为文件选择器不是元素,因此无法添加事件侦听器。
问题在于,无法控制文件重命名或用户进入的目录,因为程序员无法知道这些是否已经发生。由于没有内置选项,因此无法直接完成它们。
代码将如下所示:
const format = {
excludeAcceptAllOption: true,
multiple: false,
startin: window.navigator.platform.indexOf("Win") != -1 ? "D:/" : "Users/",
types: [{
description: "Your description here",
accept: {
"text/*": [".json", ".xml"],
},
}, ]
};
async function filePicker() {
var fileHandle = await window.showOpenFilePicker(format);
return fileHandle;
}
function clickFunction() {
window.showOpenFilePicker(format)
var file = filePicker();
// Do something with your file
}
.custom-file-upload {
display: flex;
cursor: pointer;
background-color: #1c3849;
color: white;
border-radius: 6px;
border: 1px solid black;
box-sizing: border-box;
align-items: center;
justify-content: center;
font: 15px "Noto Sans Display", sans-serif;
font-weight: normal;
width: 200px;
height: 50px;
margin: 0;
}
.custom-file-upload:hover {
background-color: #006e9e;
}
<label for="fileUpload" class="custom-file-upload">Load Parameters File</label>
<button id="fileUpload" style="display:none;" onclick="clickFunction()">
重要提示:这在浏览器代码片段中不起作用,因此您必须将其粘贴到文本编辑器中并在本地运行。