Javascript 我是否可以在提交之前确定要上载的文件是否已被删除?
是否有一种与浏览器兼容(在我的例子中是IE9、Firefox和Chrome)的方法来捕获边缘情况,即本应以HTML形式上载的文件在用户PC上被重命名或删除,因此无法提交 在这种情况下,我想在无法提交后向用户显示一个错误。Javascript 我是否可以在提交之前确定要上载的文件是否已被删除?,javascript,html,forms,file-upload,Javascript,Html,Forms,File Upload,是否有一种与浏览器兼容(在我的例子中是IE9、Firefox和Chrome)的方法来捕获边缘情况,即本应以HTML形式上载的文件在用户PC上被重命名或删除,因此无法提交 在这种情况下,我想在无法提交后向用户显示一个错误。 如果您在IE中选择一个文件,然后在文件系统中删除它,Windows将只隐藏该文件,它不会被删除,并且内容可以读取。因此您不必担心IE 删除文件时,Chrome会将文件大小(input.files[0].size)调整为0。遗憾的是,Firefox没有做到这一点 使用API()
- 如果您在IE中选择一个文件,然后在文件系统中删除它,Windows将只隐藏该文件,它不会被删除,并且内容可以读取。因此您不必担心IE
- 删除文件时,Chrome会将文件大小(
)调整为0。遗憾的是,Firefox没有做到这一点input.files[0].size
函数checkDeleted(){
输入=document.getElementById('fileInput');
如果(input.files.length>0){
var file=input.files[0];
var fr=new FileReader();
fr.onload=功能(e){
警报(“文件可读”);
};
fr.onerror=函数(e){
如果(e.target.error.name==“NotFoundError”){
警报(“文件已删除”);
}
}
fr.readAsText(文件);
}否则{
//还没有选择文件
}
}
工作小提琴。基于@CommonGuy的答案,我尝试了一下,并调整了一个优化版本。(使用最新的Chrome和Firefox进行了测试。) 注意:预测文件是否可以读取和传输。无论文件被删除、修改或权限更改,都可能导致上载错误,因此我们尝试读取最后一个字节(考虑性能和firefox兼容性)
函数tryReadingFile(文件){
返回新承诺((解决、拒绝)=>{
如果(!(文件实例文件)){
拒绝(新错误(“不是文件”);
返回;
}
设r=newfilereader();
r、 onload=(e)=>{
解决();
};
r、 onerror=(e)=>{
拒绝(r.错误);
};
r、 readAsArrayBuffer(file.size>0?file.slice(-1):文件);
});
}
函数$(s,c){
返回(c?c:文档)。查询选择器;
}
让当前文件;
函数集SelectedFile(文件){
currentFile=文件;
$('#output')。innerHTML=文件?'pending':'';
}
函数handleTestClick(){
如果(!currentFile){
返回;
}
tryReadingFile(当前文件)。然后((确定)=>{
$('输出')。值='确定';
},(e)=>{
$(“#输出”).value=e.toString();
});
}
步骤1:选择一个文件
步骤2:删除文件
转到文件管理器,并重命名/删除/修改文件
步骤3:测试所选文件是否可以读取(并准备好上载)
测试
尊敬的downvoter,欢迎反馈。解决方法是检查是否大于0字节…如何不清楚此处询问的内容?这个问题很有道理,不是吗?这不适用于IE,任何IE解决方案都不行。甚至fr.readAsText(文件);异步工作。任何将同步检查它的方法
<input type="file" id="fileInput" />
<input type="button" onClick="checkDeleted();" value="Check"/>
<script>
function checkDeleted() {
input = document.getElementById('fileInput');
if (input.files.length > 0) {
var file = input.files[0];
var fr = new FileReader();
fr.onload = function (e) {
alert("File is readable");
};
fr.onerror = function (e) {
if (e.target.error.name == "NotFoundError") {
alert("File deleted");
}
}
fr.readAsText(file);
} else {
// no file choosen yet
}
}
</script>