web-dev-qa-db-ja.com

ファイルアップロードのファイルタイプを検証するにはどうすればよいですか?

使っています <input type="file" id="fileUpload" runat="server"> ASP.NETアプリケーションでファイルをアップロードします。アップロードするファイルの種類を制限したい(例:ファイル拡張子を.xlsまたは.xlsxに制限する)。

JavaScriptまたはサーバー側の検証はどちらもOKです(ファイルがアップロードされる前にサーバー側の検証が行われる場合-非常に大きなファイルがアップロードされる可能性があるため、実際のファイルがアップロードされる前に検証を行う必要があります) 。

36
Yaakov Ellis

アップロード前にチェックを実行するため、オプションが制限されるようです。取得する最善の方法は、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;
      }
}
30
Jamie

正規表現バリデーターを使用すると、非常に簡単です。

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

アップロードが許可されているファイルタイプのクライアント側検証

26
shailesh

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>
6
staktrace

私はChrisに同意します。拡張子を確認することは、ファイルの種類を検証することではありません。 TelerikのradUpload はおそらく最良のオプションです。アップロードされるファイルのContentTypeプロパティを提供し、既知のMIMEタイプと比較できます。以下を確認する必要があります。

application/vnd.ms-Excel、

アプリケーション/ Excel、

application/x-msexcel

新しい2k7形式の場合:

application/vnd.openxmlformatsofficedocument.spreadsheetml.sheet

TelerikはradUploadを個別のコンポーネントとして販売していましたが、現在はコントロールスイートにラップされているため、少し高価になりますが、真のタイプをチェックする最も簡単な方法です

6
kd7

アップロードコントロールで正規表現バリデーターを使用できます。

  <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>

Inputタグのaccept属性もあります。

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

しかし、私はこれを試したときにあまり成功しませんでした(FF3とIE7で)

4
AlexWilson

一部の人々が言及しているように、Javascriptが道です。ここでの「検証」はファイル拡張子のみによるものであり、ファイルが実際のExcelスプレッドシートであることを検証しないことに注意してください。

3
Jonathan Arkell

ファイルのコンテンツタイプを確認することを提案するkd7の返信に基づいて、ラッパーメソッドを次に示します。

private bool FileIsValid(FileUpload fileUpload)
{
    if (!fileUpload.HasFile)
    {
        return false;
    }
    if (fileUpload.PostedFile.ContentType == "application/vnd.ms-Excel" ||
        fileUpload.PostedFile.ContentType == "application/Excel" ||
        fileUpload.PostedFile.ContentType == "application/x-msexcel" ||
        fileUpload.PostedFile.ContentType == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" //this is xlsx format
        )
        return true;

    return false;
}

アップロードするファイルが.xlsまたは.xlsxの場合、trueを返します

3
m_cheung

サーバー側でファイル拡張子を常にチェックして、誰も.aspx、.aspなどの悪意のあるファイルをアップロードできないことを確認してください。

2
dr. evil

さて、ポストバック中にファイルが送信(アップロード)されるため、ポストバックでサーバー側で実行することはできません。

JavaScriptを使用してクライアントでそれを行うことができると思います。個人的には、 radUpload by Telerik というサードパーティのコンポーネントを使用しています。優れたクライアント側とサーバー側のAPIを備えており、大きなファイルをアップロードするための進行状況バーを提供します。

オープンソースのソリューションも利用できると確信しています。

1
Chris Roberts

代替オプションとして、受け入れ可能なMIMEタイプを定義するHTMLファイル入力の「accept」属性を使用できますか。

定義 ここ

1
chillysapien

標準のAsp.Netコントロールを避け、Brettle DevelopmentのNeadUploadコンポーネントを使用します。 http://www.brettle.com/neatupload

より高速で使いやすく、構成ファイルのmaxRequestLengthパラメーターを心配せず、非常に簡単に統合できます。

1

これを行うにはさまざまな方法があると思います。私はaspに詳しくないので、特定のファイルタイプをチェックするためのヒントを提供するだけです:

1)安全な方法:渡すファイルタイプのヘッダーに関する詳細情報を取得します。アップロードされたファイルを解析し、ヘッダーを比較します

2)簡単な方法:ファイルの名前を2つの部分に分割します->ファイルの名前とファイルの終わり。ファイルの末尾を確認し、アップロードを許可するファイルタイプと比較します

それが役に立てば幸い :)

1
DeeCee

サーバー側はファイルが既にアップロードされていることを意味するため、唯一の選択肢はクライアント側の検証のようです。また、MIMEタイプは通常、ファイル拡張子によって決定されます。

jQueryのようなJavaScriptフレームワークを使用して、フォームのonsubmitイベントをオーバーロードします。次に、拡張子を確認します。これにより、ほとんどの試行が制限されます。ただし、人が画像を拡張子XLSに変更すると、問題が発生します。

これがあなたのためのオプションであるかどうかはわかりませんが、SilverlightやFlashのようなものを使用してアップロードする場合、より多くのクライアント側のコントロールがあります。これらのテクノロジーのいずれかをアップロードプロセスに使用することを検討できます。

0
Nick Berardi

別の回答者のメモとして、ファイルタイプはスプーフィングされる可能性があります(たとえば、.exeは.pdfに名前が変更されます)。MIMEタイプのチェックでは防止できません(つまり、.exeが。 pdf)。真のファイルタイプのチェックはサーバー側でのみ実行できると考えています。 System.IO.BinaryReaderを使用して確認する簡単な方法は、次のとおりです。

http://forums.asp.net/post/2680667.aspx

およびVBここのバージョン:

http://forums.asp.net/post/2681036.aspx

チェックするファイルタイプのバイナリ「コード」を知る必要がありますが、このソリューションを実装してコードをデバッグすることで取得できます。

0
Mark_fsg

クライアント側の検証チェック:-

HTML:

<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="btnUpload" runat="server" Text="Upload" OnClientClick = "return ValidateFile()"  OnClick="btnUpload_Click"  />
<br />
<asp:Label ID="Label1" runat="server" Text="" />

Javascript:

<script type ="text/javascript">

    var validFilesTypes=["bmp","gif","png","jpg","jpeg","doc","xls"];

    function ValidateFile()

    {

      var file = document.getElementById("<%=FileUpload1.ClientID%>");

      var label = document.getElementById("<%=Label1.ClientID%>");

      var path = file.value;

      var ext=path.substring(path.lastIndexOf(".")+1,path.length).toLowerCase();

      var isValidFile = false;

      for (var i=0; i<validFilesTypes.length; i++)    
      {    
        if (ext==validFilesTypes[i])    
        {    
            isValidFile=true;    
            break;    
        }    
      }

      if (!isValidFile)    
      {    
        label.style.color="red";    
        label.innerHTML="Invalid File. Please upload a File with" +    
         " extension:\n\n"+validFilesTypes.join(", ");    
      }    
      return isValidFile;    
     }    
</script>
0
Rana