Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我是否可以在提交之前确定要上载的文件是否已被删除?_Javascript_Html_Forms_File Upload - Fatal编程技术网

Javascript 我是否可以在提交之前确定要上载的文件是否已被删除?

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()

是否有一种与浏览器兼容(在我的例子中是IE9、Firefox和Chrome)的方法来捕获边缘情况,即本应以HTML形式上载的文件在用户PC上被重命名或删除,因此无法提交

在这种情况下,我想在无法提交后向用户显示一个错误。

  • 如果您在IE中选择一个文件,然后在文件系统中删除它,Windows将只隐藏该文件,它不会被删除,并且内容可以读取。因此您不必担心IE
  • 删除文件时,Chrome会将文件大小(
    input.files[0].size
    )调整为0。遗憾的是,Firefox没有做到这一点
使用API()的变通方法:


函数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>