html - file限制文件类型 - 如何输入type=file应该只接受pdf和xls




input file限制文件类型 (5)

我用<input type= "file" name="Upload" >

现在我想通过只接受.pdf和.xls文件来限制它。

当我单击提交按钮时,它应该验证这一点。

当我点击网页上的文件(PDF / XLS)时,它应该会自动打开。

有人可以举一些例子吗?


不幸的是,在选择时没有保证的方法。

某些浏览器支持input标记的accept属性。 这是一个良好的开端,但不能完全依赖。

<input type="file" name="pic" id="pic" accept="image/gif, image/jpeg" />

您可以使用cfinput并运行验证来检查提交时的文件扩展名 ,但不能检查mime类型。 这样更好,但仍然不是万无一失。 OSX上的文件通常没有文件扩展名,或者用户可能会恶意错误地标记文件类型。

ColdFusion的cffile可以使用结果的contentType属性( cffile.contentType )来检查mime类型,但这只能在上传完成。 这是你最好的选择,但仍然不是100%安全,因为mime类型可能仍然是错误的。


你可以使用JavaScript。 考虑到使用JavaScript执行此操作的一个大问题是重置输入文件。 好吧,这仅限于JPG(对于PDF,您必须更改mime类型幻数 ):

<form id="form-id">
  <input type="file" id="input-id" accept="image/jpeg"/>
</form>

<script type="text/javascript">
    $(function(){
        $("#input-id").on('change', function(event) {
            var file = event.target.files[0];
            if(file.size>=2*1024*1024) {
                alert("JPG images of maximum 2MB");
                $("#form-id").get(0).reset(); //the tricky part is to "empty" the input file here I reset the form.
                return;
            }

            if(!file.type.match('image/jp.*')) {
                alert("only JPG images");
                $("#form-id").get(0).reset(); //the tricky part is to "empty" the input file here I reset the form.
                return;
            }

            var fileReader = new FileReader();
            fileReader.onload = function(e) {
                var int32View = new Uint8Array(e.target.result);
                //verify the magic number
                // for JPG is 0xFF 0xD8 0xFF 0xE0 (see https://en.wikipedia.org/wiki/List_of_file_signatures)
                if(int32View.length>4 && int32View[0]==0xFF && int32View[1]==0xD8 && int32View[2]==0xFF && int32View[3]==0xE0) {
                    alert("ok!");
                } else {
                    alert("only valid JPG images");
                    $("#form-id").get(0).reset(); //the tricky part is to "empty" the input file here I reset the form.
                    return;
                }
            };
            fileReader.readAsArrayBuffer(file);
        });
    });
</script>

请注意,这是在最新版本的Firefox和Chrome以及IExplore 10上测试过的。

有关mime类型的完整列表,请参阅Wikipedia

有关幻数的完整列表,请参阅维基百科


如果您希望文件上传控件限制用户可以在按钮上单击的文件类型,那么这就是方式..

<script type="text/JavaScript">
<!-- Begin
function TestFileType( fileName, fileTypes ) {
if (!fileName) return;

dots = fileName.split(".")
//get the part AFTER the LAST period.
fileType = "." + dots[dots.length-1];

return (fileTypes.join(".").indexOf(fileType) != -1) ?
alert('That file is OK!') : 
alert("Please only upload files that end in types: \n\n" + (fileTypes.join(" .")) + "\n\nPlease select a new file and try again.");
}
// -->
</script>

然后,您可以通过上述按钮的onClick等事件调用该函数,如下所示:

onClick =“TestFileType(this.form.uploadfile.value,['gif','jpg','png','jpeg']);”

您可以将其更改为: PDFXLS

你可以看到它在这里实现: Demo


您可以使用属性accept并向其添加允许的mime-types来实现。 但并非所有浏览器都尊重该属性,并且可以通过某些代码检查器轻松删除它。 因此,在任何一种情况下,您都需要检查服务器端的文件类型(第二个问题)。

例:

<input type="file" name="upload" accept="application/pdf,application/vnd.ms-excel" />

至于你的第三个问题“当我点击网页上的文件(PDF / XLS)时,它会自动打开。”:

你无法做到这一点。 如何在客户端计算机上打开PDF或XLS由用户设置。


虽然这个特殊的例子是用于多文件上传,但它提供了一个需要的一般信息:

https://developer.mozilla.org/en-US/docs/DOM/File.type

至于对文件进行/下载/这不是一个Javascript问题 - 而是一个服务器配置。 如果用户没有安装某些东西来打开PDF或XLS文件,他们唯一的选择就是下载它们。







forms