it-swarm-id.com

Bagaimana cara Memvalidasi Jenis File dari Upload File?

Saya menggunakan <input type="file" id="fileUpload" runat="server"> untuk mengunggah file dalam aplikasi ASP.NET. Saya ingin membatasi jenis file unggahan (contoh: batasi untuk ekstensi file .xls atau .xlsx). 

Baik validasi JavaScript atau sisi server OK (selama validasi sisi server akan berlangsung sebelum file diunggah - mungkin ada beberapa file yang sangat besar diunggah, jadi validasi apa pun perlu dilakukan sebelum file aktual diunggah) .

35
Yaakov Ellis

Sepertinya Anda akan memiliki opsi terbatas karena Anda ingin pemeriksaan terjadi sebelum pengunggahan. Saya pikir yang terbaik yang akan Anda dapatkan adalah menggunakan javascript untuk memvalidasi ekstensi file. Anda bisa membuat hash ekstensi yang valid dan kemudian melihat apakah ekstensi file yang diunggah ada di hash.

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;
      }
}
29
Jamie

Ini cukup sederhana menggunakan validator ekspresi reguler. 

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

Validasi Sisi Klien dari Jenis File yang Diizinkan Mengunggah

26
shailesh

Dari javascript, Anda harus bisa mendapatkan nama file di penangan onsubmit. Jadi dalam kasus Anda, Anda harus melakukan sesuatu seperti:

<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

Saya setuju dengan Chris, memeriksa ekstensi tidak memvalidasi jenis file dengan cara apa pun Anda melihatnya. RadUpload Telerik mungkin merupakan pilihan terbaik Anda, ini menyediakan properti ContentType dari file yang sedang diunggah, yang dapat Anda bandingkan dengan tipe mime yang dikenal. Anda harus memeriksa:

application/vnd.ms-Excel, 

aplikasi/Excel, 

application/x-msexcel 

dan untuk format 2k7 baru:

application/vnd.openxmlformatsofficedocument.spreadsheetml.sheet

Telerik dulu menjual radUpload sebagai komponen individual, tetapi sekarang ini dibungkus dengan suite kontrol, yang membuatnya sedikit lebih mahal, tetapi sejauh ini cara termudah untuk memeriksa tipe yang sebenarnya

6
kd7

Anda bisa menggunakan validator ekspresi reguler pada kontrol unggahan:

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

Ada juga atribut accept dari tag input:

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

tapi saya tidak terlalu sukses ketika saya mencoba ini (dengan FF3 dan IE7)

4
AlexWilson

Seperti yang telah disebutkan beberapa orang, Javascript adalah jalan yang harus ditempuh. Ingatlah bahwa "validasi" di sini hanya dengan ekstensi file, itu tidak akan memvalidasi bahwa file tersebut adalah spreadsheet Excel nyata!

3
Jonathan Arkell

Berdasarkan balasan kd7 yang menyarankan Anda memeriksa tipe konten file, inilah metode wrapper:

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

kembali benar jika file yang akan diunggah adalah .xls atau .xlsx

3
m_cheung

Pastikan Anda selalu memeriksa ekstensi file di sisi server untuk memastikan bahwa tidak ada yang dapat mengunggah file berbahaya seperti .aspx, .asp dll.

2
dr. evil

Yah - Anda tidak akan dapat melakukannya di sisi server pada post-back karena file akan dikirimkan (diunggah) selama post-back.

Saya pikir Anda mungkin dapat melakukannya pada klien menggunakan JavaScript. Secara pribadi, saya menggunakan komponen pihak ketiga yang disebut radUpload oleh Telerik . Ini memiliki API sisi klien dan sisi server yang baik, dan menyediakan bilah progres untuk unggahan file besar.

Saya yakin ada solusi open source yang tersedia juga.

1
Chris Roberts

Sebagai opsi alternatif, dapatkah Anda menggunakan atribut "accept" dari Input File HTML yang mendefinisikan tipe MIME mana yang dapat diterima.

Definisi di sini

1
chillysapien

Hindari kontrol Asp.Net standar dan gunakan komponen NeadUpload dari Brettle Development: http://www.brettle.com/neatupload

Lebih cepat, lebih mudah digunakan, tidak perlu khawatir tentang parameter maxRequestLength dalam file konfigurasi dan sangat mudah diintegrasikan.

1
massimogentilini

Saya pikir ada berbagai cara untuk melakukan ini. Karena saya tidak terbiasa dengan asp, saya hanya bisa memberi Anda beberapa petunjuk untuk memeriksa jenis file tertentu:

1) cara aman: dapatkan lebih banyak informasi tentang tajuk jenis file yang ingin Anda sampaikan. parsing file yang diunggah dan bandingkan header 

2) cara cepat: pisahkan nama file menjadi dua bagian -> nama file dan akhir file. lihat bagian akhir file dan bandingkan dengan tipe file yang Anda inginkan untuk diunggah

semoga membantu :)

1
DeeCee

Satu-satunya pilihan Anda tampaknya validasi sisi klien, karena sisi server berarti file sudah diunggah. Juga tipe MIME biasanya ditentukan oleh ekstensi file. 

gunakan JavaScript Framework seperti jQuery untuk membebani acara onsub dari formulir. Kemudian periksa ekstensi. Ini akan membatasi sebagian besar upaya. Namun jika seseorang mengubah gambar ke ekstensi XLS maka Anda akan memiliki masalah.

Saya tidak tahu apakah ini pilihan bagi Anda, tetapi Anda memiliki lebih banyak kontrol sisi klien ketika menggunakan sesuatu seperti Silverlight atau Flash untuk mengunggah. Anda dapat mempertimbangkan untuk menggunakan salah satu teknologi ini untuk proses unggah Anda.

0
Nick Berardi

Sebagai catatan responden lain, tipe file dapat dipalsukan (misalnya, .exe dinamai ulang .pdf), yang memeriksa tipe MIME tidak akan mencegah (yaitu .exe akan menampilkan MIME dari "application/pdf" jika diganti namanya. pdf). Saya percaya pemeriksaan jenis file yang benar hanya dapat dilakukan di sisi server; cara mudah untuk memeriksanya menggunakan System.IO.BinaryReader dijelaskan di sini:

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

dan versi VB di sini: 

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

Perhatikan bahwa Anda perlu mengetahui 'kode' biner untuk jenis file yang Anda periksa, tetapi Anda bisa mendapatkannya dengan menerapkan solusi ini dan men-debug kode.

0
Mark_fsg

Pemeriksaan Validasi Sisi Klien: -

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