2009-03-03 25 views
5

Tôi rất mới để ASP.net MVC, vì vậy hãy như mô tả càng tốt trong câu trả lời của bạn :)hình ảnh nhiều + lĩnh vực văn bản tải lên trong ASP.NET MVC

Hãy để tôi đơn giản hóa những gì tôi đang cố gắng để làm. Hãy tưởng tượng tôi có một hình thức mà bạn muốn nhập một số thông tin về một chiếc xe hơi. Các trường có thể là: Make, Model, Year, Image1, Image2.

Ở cuối biểu mẫu là nút "Lưu". Phương thức điều khiển liên quan sẽ lưu Image1 và Image2 vào đĩa, lấy tên tệp của chúng và liên kết chúng với mô hình ô tô, sau đó sẽ được lưu vào cơ sở dữ liệu.

Bất kỳ ý tưởng nào?

Xin cảm ơn các bạn!

Sửa

winob0t đã cho tôi hầu hết các cách đó. Vấn đề nổi bật duy nhất là như sau: Image1 và Image2 không phải là trường bắt buộc, vì vậy bây giờ tôi có thể lưu 0,1 hoặc 2 hình ảnh; nhưng nếu người dùng chỉ tải lên 1 hình ảnh tôi không có cách nào để biết liệu nó đến từ imageUpload1 hay imageUpload2.

Một lần nữa, mọi trợ giúp đều được đánh giá cao!

Trả lời

7

Trong điều khiển của bạn, bạn có thể truy cập các tập tin được tải lên như:

if(Request.Files.Count > 0 && Request.Files[0].ContentLength > 0) { 
     HttpPostedFileBase postFile = Request.Files.Get(0); 
     string filename = GenerateUniqueFileName(postFile.FileName); 
     postFile.SaveAs(server.MapPath(FileDirectoryPath + filename)); 
    } 

protected virtual string GenerateUniqueFileName(string filename) { 

    // get the extension 
    string ext = Path.GetExtension(filename); 
    string newFileName = ""; 

    // generate filename, until it's a unique filename 
    bool unique = false; 

    do { 
     Random r = new Random(); 
     newFileName = Path.GetFileNameWithoutExtension(filename) + "_" + r.Next().ToString() + ext; 
     unique = !File.Exists(FileDirectoryPath + newFileName); 
    } while(!unique); 
    return newFileName; 
} 

Các lĩnh vực văn bản sẽ đi đến hành động điều khiển của bạn như bình thường ví dụ: Request.Form [...]. Lưu ý rằng bạn cũng sẽ cần đặt mã hóa trên biểu mẫu thành "multipart/form-data". Có vẻ như bạn hiểu đủ về ASP.NET MVC để làm phần còn lại. Cũng lưu ý rằng bạn có thể khai báo thẻ biểu mẫu của bạn trong chế độ xem aspx như sau, mặc dù bạn có thể sử dụng cách tiếp cận truyền thống hơn nếu bạn muốn.

<% using(Html.BeginForm<FooController>(c => c.Submit(), FormMethod.Post, new { enctype = "multipart/form-data", @id = formId, @class = "submitItem" })) { %> 

<% } %> 
+0

Bạn đã cho tôi một nửa ở đó! Chỉ có một vấn đề nhỏ: Image1 và Image2 không được đảm bảo ở đó. Vậy nếu người dùng chỉ cung cấp Image2 chứ không phải Image1 thì sao? Có cách nào để biết điều khiển tải lên đến từ đâu không? –

+0

thay vì Request.Files [0] bạn sẽ có thể sử dụng Request.Files ["formInputname"] – LaserJesus

+0

if (Request.Files ["formInputname"]! = Null && Request.Files ["formInputname"]. ContentLength> 0) – LaserJesus

1

Đây là giải pháp của tôi, câu trả lời ở trên không hoàn toàn phù hợp với hoàn cảnh của tôi. Nó không quan tâm đến các chi tiết cụ thể về biểu mẫu và sẽ cho phép nhiều video tải lên.

for (int i = (Request.Files.Count - 1); i >= 0; i--) 
    { 
      if (Request.Files != null && Request.Files[i].ContentLength > 0) 
      { 
       string path = this.Server.MapPath("~/Content/images/"); 
       string filename = Path.GetFileName(Request.Files[i].FileName); 
       string fullpath = Path.Combine(path, filename); 
       Request.Files[i].SaveAs(fullpath); 
      } 
    } 
Các vấn đề liên quan