2012-01-10 41 views
6

Khi sử dụng một tiêu chuẩn <input type="file" /> trên một trang web MVC3, bạn có thể nhận được các tập tin trong phương pháp hành động của bạn bằng cách tạo ra một tham số đầu vào của loại HttpPostedFile và thiết lập các hình thức để enctype="multipart/form-data"Asp.Net tập tin tiên tiến tải lên

Một trong những vấn đề của phương pháp này là yêu cầu không hoàn thành và không được chuyển giao cho phương thức hành động của bạn cho đến khi toàn bộ nội dung của tệp đã được tải lên.

Tôi muốn thực hiện một số việc với tệp đó khi tệp đang được tải lên máy chủ. Về cơ bản tôi muốn nhận không đồng bộ dữ liệu khi nó đi vào và sau đó lập trình xử lý byte dữ liệu theo byte.

Để thực hiện việc trên, tôi tưởng tượng bạn sẽ cần phải xử lý phần này của yêu cầu trong một HttpModule hoặc HttpHandler tùy chỉnh có lẽ. Tôi quen thuộc với cách những thứ đó hoạt động, nhưng tôi không quen thuộc với phương thức nhận dữ liệu tải lên tệp một cách không đồng bộ như nó có.

Tôi biết điều này là có thể bởi vì tôi đã làm việc với các thành phần của bên thứ 3 trong quá khứ thực hiện việc này (thông thường để họ có thể báo cáo tiến độ tải lên hoặc lưu dữ liệu vào đĩa để tránh giới hạn bộ nhớ iis/asp.net). Thật không may tất cả các thành phần tôi đã sử dụng là nguồn đóng nên tôi không thể nhìn trộm bên trong và xem họ đang làm gì.

Tôi không tìm mã, nhưng ai đó có thể khiến tôi chỉ đúng hướng ở đây?

+0

Bạn đã xem xét yêu cầu chuyển sang Dịch vụ WCF chưa? – Lloyd

+0

Hãy xem [bài đăng của Jon Galloway] (http://weblogs.asp.net/jgalloway/archive/2008/01/08/large-file-uploads-in-asp-net.aspx), nó có thể chỉ cho bạn đi đúng hướng (cụ thể là đề cập đến [NeatUpload] (http://neatupload.codeplex.com/) có vẻ đầy hứa hẹn). – staterium

Trả lời

1

Sử dụng dịch vụ WCF, bạn có thể gửi luồng tệp đến và từ dịch vụ của mình.

Dưới đây là mặt dịch vụ nhận được mã tôi sử dụng:

int chunkSize = 2048; 
byte[] buffer = new byte[chunkSize]; 

using (System.IO.FileStream writeStream = 
    new System.IO.FileStream(file.FullName, System.IO.FileMode.CreateNew, System.IO.FileAccess.Write)) 
{ 
    do 
    { 
     // read bytes from input stream 
     int bytesRead = request.FileByteStream.Read(buffer, 0, chunkSize); 
     if (bytesRead == 0) break; 

     // write bytes to output stream 
     writeStream.Write(buffer, 0, bytesRead); 
    } while (true); 

    writeStream.Close(); 
} 

Nếu trông giống như những gì bạn muốn, hãy kiểm tra CodeProject File Transfer Progress. Nó đi vào rất nhiều chi tiết mà mã của tôi là lỏng lẻo dựa trên.

+0

Điều này có thể được sử dụng để tải lên biểu mẫu nhiều phần từ trình duyệt web không? – StriplingWarrior

+0

Trong khi điều này là thú vị và tôi đánh giá cao thời gian thực hiện để đăng này, Nó dường như không làm việc với dữ liệu tập tin được gửi bằng cách sử dụng multipart/form-data (ví dụ: từ một dạng html điển hình). – Erick

+0

Ok, xin lỗi tôi sử dụng điều này trong mã tải lên/tải xuống của tôi để tải lên nhiều tệp và sử dụng thanh tiến trình (cho một chương trình khách hàng, không phải một trang web khác). –

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