2012-08-25 32 views
18

Tôi có một bộ điều khiển như thế này:MVC3 Làm thế nào để kiểm tra xem HttpPostedFileBase là một hình ảnh

public ActionResult Upload (int id, HttpPostedFileBase uploadFile) 
{ 
.... 
} 

Làm thế nào tôi có thể chắc chắn rằng UploadFile là một hình ảnh (jpg, png, vv)

Tôi đã cố gắng với

using (var bitmapImage = new Bitmap (uploadFile.InputStream)) {..} 

sẽ ném ra một ArgumentException nếu không thể tạo bitmapImage.

Có cách nào tốt hơn chẳng hạn bằng cách xem tại uploadFile.FileName?

Trả lời

55

Bạn có thể kiểm tra tài sản HttpPostedFileBase đối tượng cho điều này

  • ContentType
  • FileName (kiểm tra các phần mở rộng tập tin mà bạn đã biết về :))

enter image description here

Cũng đây là một phương pháp nhỏ, tôi đã chuẩn bị mà bạn có thể sử dụng/mở rộng ...

private bool IsImage(HttpPostedFileBase file) 
{ 
    if (file.ContentType.Contains("image")) 
    { 
     return true; 
    } 

    string[] formats = new string[] { ".jpg", ".png", ".gif", ".jpeg" }; // add more if u like... 

    // linq from Henrik Stenbæk 
    return formats.Any(item => file.FileName.EndsWith(item, StringComparison.OrdinalIgnoreCase)); 
} 

Tôi cũng đã viết một bài báo về vấn đề này here

+0

Thaks - Tôi đã thay đổi foreach thành: 'return formats.Any (item => file.FileName.EndsWith (item, StringComparison.OrdinalIgnoreCase));' –

16

Bạn có thể kiểm tra tên file và phần mở rộng và kiểu MIME nhưng điều đó có thể không đáng tin cậy vì người sử dụng chỉ đơn giản là có thể đổi tên file trước khi tải lên. Đây là một cách đáng tin cậy để đạt được điều đó bằng cách nhìn vào nội dung của file: https://stackoverflow.com/a/6388927/29407

Bạn có thể dĩ nhiên mở rộng này sang các định dạng được biết đến loại hình ảnh khác hơn là PNG, như thế này:

public class ValidateFileAttribute : RequiredAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     var file = value as HttpPostedFileBase; 
     if (file == null) 
     { 
      return false; 
     } 

     if (file.ContentLength > 1 * 1024 * 1024) 
     { 
      return false; 
     } 

     try 
     { 
      var allowedFormats = new[] 
      { 
       ImageFormat.Jpeg, 
       ImageFormat.Png, 
       ImageFormat.Gif, 
       ImageFormat.Bmp 
      }; 

      using (var img = Image.FromStream(file.InputStream)) 
      { 
       return allowedFormats.Contains(img.RawFormat); 
      } 
     } 
     catch { } 
     return false; 
    } 
} 
+1

Tôi nghĩ rằng hãy xem qua mã ví dụ, có lẽ bạn nên đã xóa giới hạn mong muốn trên bài đăng khác của 'không vượt quá 1MB' bằng cách xóa câu lệnh if 2 - không giúp trả lời câu hỏi này. –

3

Hoặc bạn có thể kiểm tra nó ở phía khách hàng thông qua thuộc tính html 'accept' để lọc tệp asap:

@Html.TextBoxFor(x => x.HomeDeviceImage, new { @type = "file", @accept = "image/x-png, image/gif, image/jpeg" }) 

điều này sẽ chỉ hiển thị các kiểu được xác định trong thuộc tính chấp nhận của bạn làm mặc định. Cẩn thận, người dùng vẫn có thể thay đổi filetye "All files", với điều này trong tâm trí, tốt hơn kiểm tra này:

Solved concern , một đoạn javascript để kiểm tra mở rộng, và sau đó thực hiện một số chỉnh sửa để vô hiệu hóa nút như:

  $('input:submit').attr('disabled', true); 

cho đến khi phần mở rộng tệp là chính xác. tuy nhiên nó đã được kiểm tra ở phía máy chủ. :)

Các vấn đề liên quan