it-swarm-tr.com

Dosya Yüklemenin Dosya Türünü Nasıl Doğrularım?

Bir ASP.NET uygulamasında bir dosya yüklemek için <input type="file" id="fileUpload" runat="server"> kullanıyorum. Yüklemenin dosya türünü sınırlamak istiyorum (örnek: .xls veya .xlsx dosya uzantılarıyla sınırlandırın). 

Hem JavaScript hem de sunucu tarafı doğrulama işlemi tamamdır (dosyalar yüklenmeden önce sunucu tarafı doğrulaması gerçekleşeceği sürece - yüklenen çok büyük dosyalar olabilir, bu nedenle geçerli dosyalar yüklenmeden önce herhangi bir doğrulama işlemi yapılması gerekir) .

35
Yaakov Ellis

Yüklemeden önce kontrolün yapılmasını istediğiniz için sınırlı seçeneklere sahip olacaksınız gibi görünüyor. Sanırım alacağınız en iyi şey, dosyanın uzantısını doğrulamak için javascript kullanmaktır. Geçerli bir uzantı karması oluşturabilir ve yüklenen dosyanın uzantısının karmada bulunup bulunmadığına bakabilirsiniz.

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

Düzenli ifade doğrulayıcı kullanarak oldukça basit. 

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

Yüklemeye İzin Verilen Dosya Türlerinin Müşteri Tarafında Doğrulanması

26
shailesh

Javascript'ten, dosya ismini yükleme işlemcisinden alabilmelisiniz. Öyleyse, senin durumunda, şöyle bir şey yapmalısın:

<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 ile aynı fikirdeyim, uzantıyı kontrol etmek, dosya türünün bakıldığı şekilde doğrulanması değildir. Telerik'in radUpload , muhtemelen en iyi seçenek, bilinen Mime türleriyle karşılaştırabileceğiniz, yüklenmekte olan dosyanın ContentType özelliğini sağlar. Kontrol etmelisiniz:

application/vnd.ms-Excel 

application/Excel 

uygulama/x-msexcel 

ve yeni 2k7 formatı için:

uygulama/vnd.openxmlformatsofficedocument.spreadsheetml.sheet

Telerik, radUpload'u ayrı bir bileşen olarak satıyordu, ancak şimdi kontrol paketine girdi, bu da onu biraz daha pahalı hale getiriyor, ancak bugüne kadar gerçek tipini kontrol etmenin en kolay yolu

6
kd7

Yükleme kontrolünde normal bir ifade doğrulayıcı kullanabilirsiniz:

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

Aynı zamanda input etiketinin accept niteliği de var:

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

ancak bunu denediğimde çok başarılı olamadım (FF3 ve IE7 ile)

4
AlexWilson

Bazılarının söylediği gibi, Javascript gitmenin yoludur. Burada "doğrulama" nın yalnızca dosya uzantısı ile yapıldığını, dosyanın gerçek bir Excel elektronik tablosu olduğunu doğrulamayacağını unutmayın

3
Jonathan Arkell

Dosya içeriği türünü kontrol etmenizi öneren kd7'nin cevabına göre, burada bir sarmalayıcı yöntemi:

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

yüklenecek dosya .xls veya .xlsx ise true döndürülür

3
m_cheung

Hiç kimsenin kötü amaçlı dosya gibi .aspx, .asp vb. Yükleyemediğinden emin olmak için dosya uzantısını her zaman sunucu tarafında kontrol ettiğinizden emin olun.

2
dr. evil

Peki, dosya geri gönderilirken (yüklenirken) gönderileceği için geri gönderme sırasında sunucu tarafında yapamazsınız.

İstemcide JavaScript kullanarak bunu yapabileceğinizi düşünüyorum. Şahsen, ben Telerik tarafından radUpload adında üçüncü bir parti bileşeni kullanıyorum. İyi bir istemci tarafı ve sunucu tarafı API'ye sahiptir ve büyük dosya yüklemeleri için bir ilerleme çubuğu sağlar.

Eminim açık kaynaklı çözümler de var.

1
Chris Roberts

Alternatif bir seçenek olarak, hangi MIME türlerinin kabul edilebilir olduğunu belirleyen HTML Dosya Girişi'nin "kabul et" özelliğini kullanır mısınız?.

Tanımı burada

1
chillysapien

Standart Asp.Net kontrolünden kaçının ve Brettle Development'den NeadUpload bileşenini kullanın: http://www.brettle.com/neatupload

Daha hızlı, kullanımı daha kolay, config dosyalarındaki maxRequestLength parametresi için endişelenmeyin ve entegrasyonu çok kolay.

1
massimogentilini

Bunu yapmanın farklı yolları olduğunu düşünüyorum. Asp ile aşina olmadığım için, belirli bir dosya türünü denetlemeniz için size yalnızca bazı ipuçları verebilirim:

1) güvenli yol: geçmek istediğiniz dosya türünün başlığı hakkında daha fazla bilgi edinin. yüklenen dosyayı ayrıştırın ve başlıkları karşılaştırın 

2) hızlı yol: dosyanın adını iki parçaya ayırın -> dosyanın adı ve dosyanın sonu. Dosyanın sonunu kontrol edin ve yüklenmesine izin vermek istediğiniz dosya türüyle karşılaştırın

umarım yardımcı olur :)

1
DeeCee

Tek seçeneğiniz müşteri tarafında doğrulama gibi gözüküyor, çünkü sunucu tarafı dosyanın zaten yüklenmiş olduğu anlamına geliyor. Ayrıca MIME tipi genellikle dosya uzantısı tarafından belirlenir. 

formun teslim etme olayını aşırı yüklemek için jQuery gibi bir JavaScript Framework kullanın. Ardından uzantıyı kontrol edin. Bu, çoğu denemeyi sınırlandırır. Ancak bir kişi XLS uzantılı bir resmi değiştirirse sorun yaşarsınız.

Bunun sizin için bir seçenek olup olmadığını bilmiyorum, ancak Silverlight veya Flash gibi bir şey kullanırken yüklenmek üzere daha fazla müşteri kontrolüne sahipsiniz. Yükleme teknolojiniz için bu teknolojilerden birini kullanmayı düşünebilirsiniz.

0
Nick Berardi

Diğer bir cevaplayıcı olarak, dosya türü sahte olabilir (örn. .Exe yeniden adlandırılmış .pdf), MIME türünü kontrol etmeyi engellemez (örneğin, .exe yeniden adlandırılırsa "application/pdf" MIME gösterecektir. pdf). Doğru dosya tipinin kontrolünün sadece sunucu tarafında yapılabileceğine inanıyorum; System.IO.BinaryReader kullanarak kontrol etmenin kolay bir yolu burada açıklanmıştır:

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

ve VB versiyonu burada: 

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

Kontrol ettiğiniz dosya türleri için ikili kodları bilmeniz gerekeceğini unutmayın, ancak bu çözümü uygulayarak ve kodda hata ayıklayarak bunları alabilirsiniz.

0
Mark_fsg

Müşteri Tarafı Doğrulama Kontrolü: -

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