ファイルアップロードのファイルタイプを検証するにはどうすればよいですか?
-
09-06-2019 - |
質問
使っています <input type="file" id="fileUpload" runat="server">
ASP.NET アプリケーションにファイルをアップロードします。アップロードするファイルの種類を制限したいと考えています(例:ファイル拡張子は .xls または .xlsx に制限されます)。
JavaScript とサーバー側の検証は両方とも問題ありません (ファイルがアップロードされる前にサーバー側の検証が行われる限り、非常に大きなファイルがアップロードされる可能性があるため、実際のファイルがアップロードされる前に検証を行う必要があります)。 。
解決
アップロード前にチェックを実行したいので、選択肢が限られているようです。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;
}
}
他のヒント
正規表現バリデーターを使用するのは非常に簡単です。
<asp:RegularExpressionValidator
id="RegularExpressionValidator1"
runat="server"
ErrorMessage="Only zip file is allowed!"
ValidationExpression ="^.+(.zip|.ZIP)$"
ControlToValidate="FileUpload1"
> </asp:RegularExpressionValidator>
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のradアップロード これはおそらく最良のオプションであり、アップロードされるファイルの ContentType プロパティを提供し、既知の MIME タイプと比較できます。次の点を確認する必要があります。
アプリケーション/vnd.ms-excel、
アプリケーション/エクセル、
アプリケーション/x-msexcel
新しい 2k7 フォーマットの場合:
application/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>
input タグの accept 属性もあります。
<input type="file" accept="application/msexcel" id="fileUpload" runat="server">
しかし、これを試したときはあまり成功しませんでした(FF3とIE7で)
何人かの人が言及しているように、JavaScript が最適です。ここでの「検証」はファイル拡張子によってのみ行われ、ファイルが実際の Excel スプレッドシートであるかどうかは検証されないことに注意してください。
ファイルのコンテンツ タイプを確認することを提案する 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 を返します。
誰もアップロードできないように、サーバー側でファイル拡張子を常に確認してください。 悪意のあるファイル .aspx、.asp など。
ファイルはポストバック中に送信 (アップロード) されるため、ポストバックではサーバー側でそれを行うことはできません。
JavaScriptを使用してクライアント上で実行できると思います。個人的には、次のサードパーティ コンポーネントを使用しています。 radTelerik によるアップロード. 。優れたクライアント側とサーバー側の API があり、大きなファイルのアップロードには進行状況バーが表示されます。
オープンソースのソリューションも利用できると思います。
これにはさまざまな方法があると思います。私は ASP に詳しくないので、特定のファイルタイプを確認するためのヒントしか提供できません。
1) 安全な方法:渡したいファイルタイプのヘッダーに関する詳細情報を取得します。アップロードされたファイルを解析し、ヘッダーを比較します
2) 簡単な方法:ファイル名を 2 つの部分に分割します -> ファイル名とファイルの末尾。ファイルの末尾を確認し、アップロードを許可するファイルタイプと比較します。
それが役に立てば幸い :)
標準の Asp.Net コントロールを避け、Brettle Development の NeadUpload コンポーネントを使用します。 http://www.brettle.com/neatupload
より高速で使いやすく、構成ファイルの maxRequestLength パラメータを気にする必要がなく、統合も非常に簡単です。
代替オプションとして、どの MIME タイプが受け入れられるかを定義する HTML ファイル入力の「accept」属性を使用できますか。
意味 ここ
サーバー側はファイルがすでにアップロードされていることを意味するため、唯一のオプションはクライアント側の検証のようです。また、MIME タイプは通常、ファイル拡張子によって決まります。
jQuery などの JavaScript フレームワークを使用して、フォームの onsubmit イベントをオーバーロードします。次に拡張子を確認します。これにより、ほとんどの試行が制限されます。ただし、誰かが画像を拡張子 XLS に変更すると、問題が発生します。
これが選択肢になるかどうかはわかりませんが、Silverlight や Flash などを使用してアップロードする場合、クライアント側での制御が強化されます。アップロード プロセスにこれらのテクノロジーのいずれかを使用することを検討してください。
別の回答者が指摘しているように、ファイル タイプはスプーフィングされる可能性があります (例: .exe が .pdf に名前変更される)。これは MIME タイプのチェックでは防止できません (つまり、.exe は .pdf に名前変更された場合、「application/pdf」という MIME を表示します)。 pdf)。真のファイルタイプのチェックはサーバー側でのみ実行できると思います。System.IO.BinaryReader を使用してそれを確認する簡単な方法をここで説明します。
http://forums.asp.net/post/2680667.aspx
VB バージョンはこちら:
http://forums.asp.net/post/2681036.aspx
チェックしているファイルの種類のバイナリ「コード」を知っている必要がありますが、このソリューションを実装してコードをデバッグすることで取得できることに注意してください。
クライアント側の検証チェック:-
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>