HTML表单上传中的过滤器扩展[重复]

Posted

技术标签:

【中文标题】HTML表单上传中的过滤器扩展[重复]【英文标题】:Filter Extensions in HTML form upload [duplicate] 【发布时间】:2010-09-20 05:32:26 【问题描述】:

我有一个简单的 html 上传表单,我想指定一个默认扩展名(例如“*.drp”)。我已经读过这样做的方法是通过输入标签的 ACCEPT 属性,但我不知道具体如何。

<form enctype="multipart/form-data" action="uploader.php" method="POST">
Upload DRP File:
<input name="Upload Saved Replay" type="file" accept="*.drp"/><br />
<input type="submit" value="Upload File" />
</form>

编辑 我知道可以使用 javascript 进行验证,但我希望用户只在他的弹出对话框中看到“.drp”文件。另外,我不太关心这个应用程序中的服务器端验证。

【问题讨论】:

【参考方案1】:

accept 属性需要 MIME 类型,而不是文件掩码。例如,要接受 PNG 图像,您需要 accept="image/png"。您可能需要找出浏览器认为您的文件类型是什么 MIME 类型,并相应地使用它。但是,由于“drp”文件并不标准,您可能必须接受通用 MIME 类型。

此外,似乎大多数浏览器可能不支持此属性。

过滤文件上传的更好方法是在服务器端。这很不方便,因为偶尔的用户可能会浪费时间上传文件,只是为了知道他们选择了错误的文件,但至少你会有某种形式的数据完整性。

或者,您可以选择在提交表单之前使用 JavaScript 进行快速检查。只需检查文件字段值的扩展名,看看它是否为“.drp”。这可能会比接受属性更受支持。

【讨论】:

有用的提示:这整个线程是十年前最好的部分。不完全是关于最受支持和最不支持的最新信息。 等等,我的评论呢?你是怎么把它删除的? 不幸的是,截至 2015 年 12 月,这一切似乎都是最新的。该属性仍然没有得到很好的支持。我给它提供了十几种 MIME 字体内容类型,它唯一识别的是 .woff。无法识别 TTF 和其他字体类型。对于文件选择器来说,尽管 MIME 类型比文件扩展名更合适,这实际上是愚蠢的。 MIME 类型没用,因为文件选择器按文件扩展名过滤,而不是 MIME 类型,它无法验证 MIME 类型,甚至无法识别我提供的类型的 1/10。多么遗憾的状态。【参考方案2】:

accept 属性指定表单目标将正确处理的内容类型(MIME 类型)的逗号分隔列表。不幸的是,所有主要浏览器都忽略了此属性,因此它不会以任何方式影响浏览器的文件对话框。

【讨论】:

accept=.csv 为我工作............【参考方案3】:

您可以使用 javascript 来实现。在提交函数中获取表单字段的值,解析出扩展。

你可以这样开始:

<form name="someform"enctype="multipart/form-data" action="uploader.php" method="POST">
<input type=file name="file1" />
<input type=button onclick="val()" value="xxxx" />
</form>
<script>
function val() 
    alert(document.someform.file1.value)

</script>

我同意 alexmac - 在服务器端也这样做。

【讨论】:

为什么使用onclick而不是onchange【参考方案4】:

我不会使用这个属性,因为大多数浏览器都会忽略它,正如 CMS 指出的那样。

无论如何都要使用客户端验证,但只能与服务器端结合使用。任何客户端验证都可以进行。

有点偏离主题,但有些人会检查内容类型以验证上传的文件。您需要注意这一点,因为攻击者可以轻松更改它并上传例如 php 文件。参见示例:http://www.scanit.be/uploads/php-file-upload.pdf

【讨论】:

这只是一个可用性问题。【参考方案5】:

我使用 javascript 检查文件扩展名。这是我的代码:

HTML

<input name="fileToUpload" type="file" onchange="check_file()" >

.. ..

javascript

function check_file()
                str=document.getElementById('fileToUpload').value.toUpperCase();
        suffix=".JPG";
        suffix2=".JPEG";
        if(str.indexOf(suffix, str.length - suffix.length) == -1||
                       str.indexOf(suffix2, str.length - suffix2.length) == -1)
        alert('File type not allowed,\nAllowed file: *.jpg,*.jpeg');
            document.getElementById('fileToUpload').value='';
        
    

【讨论】:

if(str.indexOf(suffix, str.length - suffix.length) == -1 && str.indexOf(suffix2, str.length - suffix2.length) == -1)跨度> @Nazri,但是,这不会减少在“上传文件资源管理器”中显示给用户的选择。【参考方案6】:

另一种解决方案只有几行

function checkFile(i)
  i = i.substr(i.length - 4, i.length).toLowerCase();
  i = i.replace('.','');
  switch(i)
    case 'jpg':
    case 'jpeg':
    case 'png':
    case 'gif':
      // do OK stuff
      break;
    default:
      // do error stuff
      break;
  

【讨论】:

【参考方案7】:

对于像您的“.drp”这样的特定格式。您可以直接在 accept=".drp" 中传递它,它将为此工作。

但没有“*”

<input name="Upload Saved Replay" type="file" accept=".drp" />
<br/>

【讨论】:

以上是关于HTML表单上传中的过滤器扩展[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中检查上传表单中的文件扩展名 [重复]

html 表单上传图片

PHP sql插入无法从html表单工作[重复]

javaWeb 文件上传

使用 PHP 过滤器(Filter)进行严格表单验证

表单正则验证及文件上传验证