如何验证文件上传的文件类型?

IT技术 asp.net javascript validation file upload
2021-01-22 10:12:45

我正在使用<input type="file" id="fileUpload" runat="server">在 ASP.NET 应用程序中上传文件。我想限制上传的文件类型(例如:限制为 .xls 或 .xlsx 文件扩展名)。

JavaScript 或服务器端验证都可以(只要在上传文件之前进行服务器端验证 - 可能上传了一些非常大的文件,因此需要在上传实际文件之前进行任何验证) .

6个回答

似乎您的选择有限,因为您希望在上传之前进行检查。我认为最好的方法是使用 javascript 来验证文件的扩展名。您可以构建有效扩展名的散列,然后查看正在上传的文件的扩展名是否存在于散列中。

HTML:

<input type="file" name="FILENAME"  size="20" onchange="check_extension(this.value,"upload");"/>
<input type="submit" id="upload" name="upload" value="Attach" disabled="disabled" />

Javascript:

var hash = {
  'xls'  : 1,
  'xlsx' : 1,
};

function check_extension(filename,submitId) {
      var re = /\..+$/;
      var ext = filename.match(re);
      var submitEl = document.getElementById(submitId);
      if (hash[ext]) {
        submitEl.disabled = false;
        return true;
      } else {
        alert("Invalid filename, please select another file");
        submitEl.disabled = true;

        return false;
      }
}
@贾斯汀摩尔:好的解决方案,一个变化: var ext = value.slice(value.lastIndexOf(".") + 1).toLowerCase();
2021-03-29 10:12:45
当文件名包含额外的 . 例如 my.file.doc 时,这将返回 false
2021-04-02 10:12:45
我在上面使用,但使用:'var ext = value.slice(value.lastIndexOf(".")).toLowerCase();'获得了文件的扩展名
2021-04-02 10:12:45
不要忘记,这只是客户端验证。我仍然可以“手动”向表单 url 发送 HTTP-POST 以绕过此检查 - 您还需要进行服务器端验证检查。
2021-04-06 10:12:45
只需将这些扩展名添加到变量“hash”。var hash = { 'xls' : 1, 'xlsx' : 1, 'doc' : 1, 'docx' : 1 };
2021-04-06 10:12:45

使用正则表达式验证器非常简单。

<asp:RegularExpressionValidator
id="RegularExpressionValidator1"
runat="server"
ErrorMessage="Only zip file is allowed!"
ValidationExpression ="^.+(.zip|.ZIP)$"
ControlToValidate="FileUpload1"
> </asp:RegularExpressionValidator>

允许上传的文件类型的客户端验证

默认情况下,正则表达式区分大小写。您可以使用 (?i) 为组禁用它(如此处所述 -> exampledepot.com/egs/java.util.regex/Case.html)。但是,它不适用于 Javascript(如此处所述stackoverflow.com/questions/2641236 /... 并由我亲自测试)。
2021-04-02 10:12:45

从 javascript 中,您应该能够在 onsubmit 处理程序中获取文件名。因此,在您的情况下,您应该执行以下操作:

<form onsubmit="if (document.getElementById('fileUpload').value.match(/xls$/) || document.getElementById('fileUpload').value.match(/xlsx$/)) { alert ('Bad file type') ; return false; } else { return true; }">...</form>

我同意 Chris 的观点,检查扩展名并不是对文件类型的任何验证。Telerik 的 radUpload可能是您最好的选择,它提供了上传文件的 ContentType 属性,您可以将其与已知的 mime 类型进行比较。您应该检查:

应用程序/vnd.ms-excel,

应用程序/excel,

应用程序/x-msexcel

对于新的 2k7 格式:

应用程序/vnd.openxmlformatsofficedocument.spreadsheetml.sheet

Telerik 曾经将 radUpload 作为一个单独的组件出售,但现在它被包裹在控件套件中,这使得它有点贵,但到目前为止它是检查真实类型的最简单方法

您可以在上传控件上使用正则表达式验证器:

  <asp:RegularExpressionValidator id="FileUpLoadValidator" runat="server" ErrorMessage="Upload Excel files only." ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.xls|.XLS|.xlsx|.XLSX)$" ControlToValidate="fileUpload"> </asp:RegularExpressionValidator>

还有输入标签的accept属性:

<input type="file" accept="application/msexcel" id="fileUpload" runat="server">

但是当我尝试这个时并没有取得太大的成功(使用 FF3 和 IE7)