如何使输入类型=文件应仅接受pdf和xls


96

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

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

当我单击提交按钮时,应对此进行验证。

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

有人可以为此提供一些示例吗?

Answers:


174

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

例:

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

第三个问题是“当我单击网页上的文件(PDF / XLS)时,它应该自动打开。”:

您无法实现。用户设置如何在客户端计算机上打开PDF或XLS。


嗨,feelela当我上传文件时,它将存储在服务器中。我听说,可以通过javascript函数通过单击浏览器上的文件来打开.pdf和.xls文件...
Manikandan

而已 !客户端和服务器双方都进行了解释。好的答案

2
如果在选择框中列出所有文件。您仍然可以上传任何文件。
rüff0

55

您可以使用此:

的HTML

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

仅支持。PDF和。XLS文件


14

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

某些浏览器支持标签的accept属性input。这是一个好的开始,但不能完全依靠。

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

您可以使用cfinput并运行验证来检查提交时的文件扩展名,但不能检查mime类型。这是更好的方法,但仍然不够安全。OSX上的文件通常没有文件扩展名,否则用户可能会恶意地错误标记文件类型。

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


3
请,永远不要检查基于扩展名的文件。名为lolcat.jpg的可执行文件呢?
Feeela 2012年

1
我认为phantom42在这里要说的是,您应该检查服务器上的扩展名和MIME类型。在accept该属性input标签可以添加,但不是100%有效。
克里斯·彼得斯

我100%同意。不能依靠它,但是我发现它与cffile.contenttype一起作为第一道防线是可以的。
乔C

嗨,魅影正如您所说,这种接受仅适用于chrome,不适用于IE。还有其他方法可以得到所有浏览器的支持吗
Manikandan

抱歉不行; 这就是为什么我说它不能被依赖,如果您完全使用它,则必须与其他方法结合使用。
乔C

3

您可以使用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

有关幻数的完整列表,请参见Wikipedia




0

如果您希望文件上传控件限制用户可以通过按钮上传的文件类型,请单击“确定”。

<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

您可以在此处看到它的实现:演示


感谢Vishal Suthar。我认为这种逻辑肯定会帮助我前进。
Manikandan '08年

这是我的pleasure..It将肯定帮助,但仍然没有给予好评?? @ Manikandan
维沙尔Suthar

仍然我还有一个疑问。我试图限制输入type = file中的文件(仅PDF&Xls.xlsx)。但是它在Google Chrome中可以正常工作。但是我无法在IE中做到这一点。有什么解决方案可以限制IE中的文件?如果是,请让我以正确的方式前进。
Manikandan '08年

我只是检查(codestore.net/store.nsf/unid/DOMM-4Q8H9E)在IE浏览器,它工作正常.. @ Manikandan
维沙尔Suthar

accept-attribute 相比,此方法不会在本地计算机上选择文件时将文件夹内容缩小到所选文件类型。
Feeela 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.