如何允许<input type =“ file”>仅接受图像文件?


375

我只需要通过<input type="file">标签上传图像文件。

现在,它接受所有文件类型。但是,我想将它限制为仅特定的图像文件的扩展名,其中包括.jpg.gif等等。

如何实现此功能?


服务器端使用什么技术?
Erdal G.

1
kbvishnu,也许您可​​以重新考虑您很久以前接受的答案。您不必接受其他答案。我只是建议,根据我们在答案上得到的标志数目及其与其他答案相比的投票水平,也许您至少应该考虑不接受它。
亚伦·霍尔

Answers:


942

使用输入标签的accept属性。因此,仅接受PNG,JPEG和GIF可以使用以下代码:

<input type="file" name="myImage" accept="image/x-png,image/gif,image/jpeg" />

或者简单地:

<input type="file" name="myImage" accept="image/*" />

请注意,这仅向浏览器提示要显示给用户的文件类型,但这很容易绕开,因此您还应该始终在服务器上验证上载的文件。

它应该可以在IE 10 +,Chrome,Firefox,Safari 6 +,Opera 15+中运行,但是在移动设备上的支持非常粗略(截至2015年),并且据报道,这实际上可能阻止某些移动浏览器完全上传任何内容,因此请务必正确测试目标平台。

有关详细的浏览器支持,请参见http://caniuse.com/#feat=input-file-accept


@madcap accept="file/csv, file/xls"有效吗?
KNU

19
您确定是image/x-png吗?根据此列表,它仅为image/pngiana.org/assignments/media-types/media-types.xhtml
Micros,

6
那应该是选择的答案!只是缺少说明,您仍然需要检查服务器端(因为不支持浏览器,而且还需要确保安全性)
Erdal G.

1
当答案是答案时,它可能起作用,但只是尝试了一下,对FF不起作用。我只需要添加accept =“。png,.jpg,.jpeg”例如:jsfiddle.net/DiegoTc/qjsv8ay9/4
迭戈

1
不要完全依赖它。它也可以轻松接受其他文件。您只需要更改打开文件窗口中允许的文件类型。

163

使用这个:

<input type="file" accept="image/*">

在FF和Chrome中均可使用。


14
accept属性不是一个验证工具,所有上传都应该在服务器上进行验证,始终……
TlonXP

1
仍然在本机android浏览器中不受支持,但可以在其他平台上很好地工作,我想是caniuse.com/#feat=input-file-accept
mcy

我喜欢这种解决方案,因为在文件提示符下,类型下拉列表显示“ Image Files”。
硬性设置

请注意这一点,因为它允许使用您可能不需要的SVG。
stephenmurdoch

这将允许最大图像文件.png,.jpg,.jpeg,.gif,.bmp,.ico,.tiff,.svg,.ai,.psp,.pcd,.pct,.raw。因此,最好具体提及类型。
Thamarai T


28

步骤:
1.将accept属性添加到输入标签
2.使用javascript
进行验证3.添加服务器端验证以验证内容是否确实是预期的文件类型

对于HTML和javascript:

<html>
<body>
<input name="image" type="file" id="fileName" accept=".jpg,.jpeg,.png" onchange="validateFileType()"/>
<script type="text/javascript">
    function validateFileType(){
        var fileName = document.getElementById("fileName").value;
        var idxDot = fileName.lastIndexOf(".") + 1;
        var extFile = fileName.substr(idxDot, fileName.length).toLowerCase();
        if (extFile=="jpg" || extFile=="jpeg" || extFile=="png"){
            //TO DO
        }else{
            alert("Only jpg/jpeg and png files are allowed!");
        }   
    }
</script>
</body>
</html>

说明:

  1. accept属性过滤将在文件选择器弹出窗口中显示的文件。但是,这不是验证。这只是浏览器的提示。用户仍然可以在弹出窗口中更改选项。
  2. javascript只验证文件扩展名,而不能真正验证所选文件是实际的jpg还是png。
  3. 因此,您必须在服务器端编写文件内容验证文件。

1
最完整的答案
偏执狂

27

这可以通过

<input type="file" accept="image/*" /> 

但这不是一个好方法。您必须在服务器端进行编码以检查文件是否为图像。

检查图像文件是真实图像还是伪图像

if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
        echo "File is an image - " . $check["mime"] . ".";
        $uploadOk = 1;
    }
    else {
        echo "File is not an image.";
        $uploadOk = 0;
    }
}

有关更多参考,请参见此处

http://www.w3schools.com/tags/att_input_accept.asp
http://www.w3schools.com/php/php_file_upload.asp



3

使用type =“ file”和accept =“ image / *”(或所需的格式),允许用户选择具有特定格式的文件。但是您必须在客户端再次重新检查它,因为用户可以选择其他类型的文件。这对我有用。

<input #imageInput accept="image/*" (change)="processFile(imageInput)" name="upload-photo" type="file" id="upload-photo" />

然后,在您的JavaScript脚本中

processFile(imageInput) {
    if (imageInput.files[0]) {
      const file: File = imageInput.files[0];
      var pattern = /image-*/;

      if (!file.type.match(pattern)) {
        alert('Invalid format');
        return;
      }

      // here you can do whatever you want with your image. Now you are sure that it is an image
    }
  }

这是最好的答案,因为它将检查文件是否实际上是图像,而无需开发人员指定他们要允许的所有不同扩展名
Adam Marshall

我明白你的想法。这是一个有效的JS语法:const file: File = imageInput.files[0];?另外,不以常规方式将id分配给输入。
Ivan P.

实际上,它不是JS,而是打字稿。块代码是从Angular项目复制而来的。如果要在javascript文件中使用它,则必须省略类型定义(:File)
Mati Cassanelli

0

如果要一次上传多张图像,可以将multiple属性添加到输入。

upload multiple files: <input type="file" multiple accept='image/*'>

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.