it-swarm-vi.tech

Làm cách nào để xác thực Loại tệp của Tải lên tệp?

Tôi đang sử dụng <input type="file" id="fileUpload" runat="server"> để tải lên tệp trong ứng dụng ASP.NET. Tôi muốn giới hạn loại tệp tải lên (ví dụ: giới hạn ở phần mở rộng tệp .xls hoặc .xlsx). 

Cả JavaScript hoặc xác thực phía máy chủ đều ổn (miễn là xác thực phía máy chủ sẽ diễn ra trước khi các tệp được tải lên - có thể có một số tệp rất lớn được tải lên, vì vậy mọi xác thực cần phải được thực hiện trước khi các tệp thực tế được tải lên) .

35
Yaakov Ellis

Có vẻ như bạn sẽ có các tùy chọn hạn chế vì bạn muốn kiểm tra xảy ra trước khi tải lên. Tôi nghĩ rằng điều tốt nhất bạn sẽ nhận được là sử dụng javascript để xác thực phần mở rộng của tệp. Bạn có thể xây dựng một hàm băm của các phần mở rộng hợp lệ và sau đó xem thử phần mở rộng của tệp đang được tải lên có tồn tại trong hàm băm không.

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

Nó khá đơn giản bằng cách sử dụng trình xác nhận biểu thức chính quy. 

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

Xác thực phía máy khách của các loại tệp được phép tải lên

26
shailesh

Từ javascript, bạn sẽ có thể có được tên tệp trong trình xử lý onsubmit. Vì vậy, trong trường hợp của bạn, bạn nên làm một cái gì đó như:

<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

Tôi đồng ý với Chris, kiểm tra phần mở rộng không xác thực loại tệp bất kỳ cách nào bạn nhìn vào nó. RadUpload của Telerik có lẽ là tùy chọn tốt nhất của bạn, nó cung cấp thuộc tính ContentType của tệp đang được tải lên, bạn có thể so sánh với các loại mime đã biết. Bạn nên kiểm tra:

ứng dụng/vnd.ms-Excel, 

ứng dụng/Excel, 

ứng dụng/x-msexcel 

và cho định dạng 2k7 mới:

application/vnd.openxmlformatsoffratedocument.s Lansheetml.sheet

Telerik đã từng bán radUpload dưới dạng một thành phần riêng lẻ, nhưng giờ đây nó được gói vào bộ điều khiển, khiến nó đắt hơn một chút, nhưng cho đến nay, cách dễ nhất để kiểm tra loại thực

6
kd7

Bạn có thể sử dụng trình xác nhận biểu thức chính quy trên điều khiển tải lên:

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

Ngoài ra còn có thuộc tính chấp nhận của thẻ đầu vào:

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

nhưng tôi đã không có nhiều thành công khi tôi thử điều này (với FF3 và IE7)

4
AlexWilson

Như một số người đã đề cập, Javascript là con đường để đi. Hãy nhớ rằng "xác thực" ở đây chỉ bằng phần mở rộng tệp, nó sẽ không xác thực rằng tệp là bảng tính Excel thực sự!

3
Jonathan Arkell

Dựa trên câu trả lời của kd7 đề nghị bạn kiểm tra loại nội dung tệp, đây là phương pháp trình bao bọc:

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

trả về true nếu tệp để tải lên là .xls hoặc .xlsx

3
m_cheung

Đảm bảo rằng bạn luôn kiểm tra phần mở rộng tệp ở phía máy chủ để đảm bảo rằng không ai có thể tải lên tệp độc hại chẳng hạn như .aspx, .asp, v.v.

2
dr. evil

Chà - bạn sẽ không thể thực hiện phía máy chủ sau khi gửi lại vì tệp sẽ được gửi (tải lên) trong quá trình hậu kỳ.

Tôi nghĩ rằng bạn có thể làm điều đó trên máy khách bằng cách sử dụng JavaScript. Cá nhân, tôi sử dụng một thành phần bên thứ ba được gọi là radUpload bởi Telerik . Nó có API phía máy khách và phía máy chủ tốt và nó cung cấp một thanh tiến trình để tải lên tệp lớn.

Tôi chắc chắn cũng có các giải pháp nguồn mở.

1
Chris Roberts

Là một tùy chọn thay thế, bạn có thể sử dụng thuộc tính "chấp nhận" của Nhập tệp HTML để xác định loại MIME nào được chấp nhận.

Định nghĩa ở đây

1
chillysapien

Tránh điều khiển Asp.Net tiêu chuẩn và sử dụng thành phần NeadUpload từ Phát triển Brellow: http://www.breling.com/neatupload

Nhanh hơn, dễ sử dụng hơn, không phải lo lắng về tham số maxRequestLpm trong tệp cấu hình và rất dễ tích hợp.

1
massimogentilini

Tôi nghĩ rằng có nhiều cách khác nhau để làm điều này. Vì tôi không quen với asp nên tôi chỉ có thể cung cấp cho bạn một số gợi ý để kiểm tra một kiểu tệp cụ thể:

1) cách an toàn: nhận thêm thông tin về tiêu đề của loại tệp bạn muốn vượt qua. phân tích tệp đã tải lên và so sánh các tiêu đề 

2) cách nhanh chóng: chia tên của tệp thành hai phần -> tên của tệp và kết thúc của tệp. kiểm tra phần cuối của tệp và so sánh nó với loại tệp bạn muốn cho phép tải lên

hy vọng nó giúp :)

1
DeeCee

Tùy chọn duy nhất của bạn dường như là xác thực phía máy khách, bởi vì phía máy chủ có nghĩa là tệp đã được tải lên. Ngoài ra loại MIME thường được quyết định bởi phần mở rộng tập tin. 

sử dụng Khung JavaScript như jQuery để quá tải sự kiện onsubmit của biểu mẫu. Sau đó kiểm tra phần mở rộng. Điều này sẽ hạn chế hầu hết các nỗ lực. Tuy nhiên, nếu một người thay đổi hình ảnh thành XLS mở rộng thì bạn sẽ gặp vấn đề.

Tôi không biết liệu đây có phải là một tùy chọn cho bạn không, nhưng bạn có nhiều quyền kiểm soát phía máy khách hơn khi sử dụng thứ gì đó như Silverlight hoặc Flash để tải lên. Bạn có thể cân nhắc sử dụng một trong những công nghệ này cho quá trình tải lên của mình.

0
Nick Berardi

Như một người trả lời khác, loại tệp có thể bị giả mạo (ví dụ: .exe được đổi tên thành .pdf), việc kiểm tra loại MIME sẽ không ngăn chặn (ví dụ: .exe sẽ hiển thị MIME của "application/pdf" nếu được đổi tên thành. pdf). Tôi tin rằng việc kiểm tra loại tệp thực sự chỉ có thể được thực hiện phía máy chủ; một cách dễ dàng để kiểm tra nó bằng System.IO.BinaryReader được mô tả ở đây:

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

và phiên bản VB tại đây: 

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

Lưu ý rằng bạn sẽ cần biết 'mã' nhị phân cho loại tệp bạn đang kiểm tra, nhưng bạn có thể lấy chúng bằng cách triển khai giải pháp này và gỡ lỗi mã.

0
Mark_fsg

Kiểm tra xác nhận phía khách hàng: -

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