2012-12-07 29 views
22

Làm theo hướng dẫn tìm thấy trên ASP.NET, thực hiện phương pháp điều khiển API Web để thực hiện tải lên tệp không đồng bộ như sau:ASP.NET Web API, kết thúc bất ngờ của luồng đa phần MIME khi tải lên từ Flex FileReference

public Task<HttpResponseMessage> PostFormData() 
{ 
    // Check if the request contains multipart/form-data. 
    if (!Request.Content.IsMimeMultipartContent()) 
    { 
     throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
    } 

    string root = HttpContext.Current.Server.MapPath("~/App_Data"); 
    var provider = new MultipartFormDataStreamProvider(root); 

    // Read the form data and return an async task. 
    var task = Request.Content.ReadAsMultipartAsync(provider). 
     ContinueWith<HttpResponseMessage>(t => 
     { 
      if (t.IsFaulted || t.IsCanceled) 
      { 
       Request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception); 
      } 

      return Request.CreateResponse(HttpStatusCode.OK); 
     }); 

    return task; 
} 

Tải lên tệp qua biểu mẫu HTML nhiều phần chuẩn hoạt động hoàn hảo. Tuy nhiên, khi một nhà phát triển khác cố gắng tải lên tệp qua nhiều hình thức được xây dựng bởi lớp FileReference của Flex, lỗi được đưa ra:

Kết thúc luồng MIME không mong đợi. Tin nhắn đa MIME chưa hoàn thành.

Tôi không biết liệu sự cố có nằm trong API Web hay Flex hay không. Tôi đã tìm thấy một số loại bản sửa lỗi có liên quan không ảnh hưởng đến (Multipart form POST using ASP.Net Web API) và gần đây là bản sửa lỗi này ("MIME multipart stream. MIME multipart message is not complete" error on webapi upload). Nếu liên kết thứ hai là đúng, có ai biết nếu nó nằm trong bản phát hành Web API hiện tại có sẵn thông qua Nuget không? Cuộc thảo luận là vào tháng 5, bản phát hành gần đây nhất từ ​​Nuget là tháng 8, vì vậy tôi cho rằng bản sửa lỗi này đã được triển khai, và không phải là nguyên nhân gốc rễ của vấn đề của tôi.

+9

Đặt trình giữ chỗ tại đây cho đến khi một trong các câu trả lời đã xóa bị hủy xóa. Tôi đã có cùng một vấn đề và sửa chữa rất đơn giản - thêm tên cho phần tử tải tệp lên. ''. Idiotic. – Will

+1

Không có tên, đầu vào không được đăng. – liammclennan

Trả lời

7

Đọc qua nghiên cứu hiện tại của bạn và theo dõi vấn đề codeplex được báo cáo có vẻ như ai đó đã xác nhận vấn đề này vẫn tồn tại trong tháng 9.

Họ tin rằng MVC 4 không phân tích cú pháp tải lên mà không bị chấm dứt "\ r \ n".

Vấn đề thực sự đơn giản nhưng rất khó khắc phục. Vấn đề là Uploadify không> không thêm một "\ r \ n" ở cuối của thông điệp MultiPartForm

http://aspnetwebstack.codeplex.com/discussions/354215

Nó có thể là giá trị kiểm tra rằng upload Flex thêm "\ r \ n "

+0

Bạn không chắc chắn về Flex (nó có loại tải lên nào khác không?), Nhưng FileReference.upload() của Flash không thêm nó. Tôi nghĩ đó là lý do tại sao Uploadify cũng không thêm nó vì chúng không thể thay đổi hành vi mặc định. – jayarjo

33

Tôi gặp vấn đề tương tự với flex. Và bên dưới là mã giải quyết nó. Về cơ bản tôi đã sử dụng một luồng tùy chỉnh để nối thêm dòng mới mà api web asp.net đang mong đợi.

 Stream reqStream = Request.Content.ReadAsStreamAsync().Result; 
     MemoryStream tempStream = new MemoryStream(); 
     reqStream.CopyTo(tempStream); 



     tempStream.Seek(0, SeekOrigin.End); 
     StreamWriter writer = new StreamWriter(tempStream); 
     writer.WriteLine(); 
     writer.Flush(); 
     tempStream.Position = 0; 


     StreamContent streamContent = new StreamContent(tempStream); 
     foreach(var header in Request.Content.Headers) 
     { 
      streamContent.Headers.Add(header.Key, header.Value); 
     } 

     // Read the form data and return an async task. 
     await streamContent.ReadAsMultipartAsync(provider); 

Hy vọng điều này sẽ hữu ích.

+2

Cảm ơn bạn đã dành thời gian để đăng bài này – leojh

+2

Chỉ giải pháp thay thế mà tôi đã thấy cho đến nay, đối với BÀI ĐĂNG Flash. Sẽ hiệu quả hơn nếu nó tạo ra một luồng ảo phát hiện sự kết thúc của luồng bên trong và nối thêm một CRLF. Điều này sẽ thổi lên khá dễ dàng nếu các tập tin lớn. – georgiosd

+1

Cảm ơn bạn, chỉ cần cảm ơn bạn – AngelKyriako

29

tôi đã cùng một vấn đề với MVC4, nhưng Will là đúng, thêm một tên cho đầu vào của bạn .....

<input type="file" id="fileInput" name="fileInput"/> 

và tất cả sự kỳ diệu là sao lưu và làm việc!

+0

làm việc cho tôi quá – Mark

+0

Điều đó hoàn toàn phù hợp với tôi, cảm ơn! – JSancho

+0

dễ dàng như vậy. Cảm ơn bạn – Amanda

4

Đối với những hạ cánh ở đây googling:

bất ngờ cuối MIME stream nhiều phần dữ liệu. Tin nhắn đa MIME chưa hoàn thành.

Đọc luồng yêu cầu nhiều lần cũng sẽ gây ra ngoại lệ này. Tôi đã vật lộn với nó trong nhiều giờ cho đến khi tôi tìm thấy một nguồn giải thích rằng luồng yêu cầu chỉ có thể được đọc một lần.

Trong trường hợp của mình, tôi kết hợp cố gắng đọc luồng yêu cầu bằng cách sử dụng MultipartMemoryStreamProvider và đồng thời cho phép ASP.NET thực hiện một số phép thuật cho tôi bằng cách chỉ định tham số (đến từ phần yêu cầu) cho phương thức api của tôi.

+0

Đây cũng là trường hợp của tôi. Cảm ơn nhiều –

2

Đảm bảo thư mục ảo ("~/App_Data" thư mục như ví dụ dưới đây) nơi tệp hình ảnh được tải lên lần đầu tiên là sự tồn tại vật lý. Khi bạn xuất bản dự án, nó có thể không có trong các tệp đầu ra.

string root = HttpContext.Current.Server.MapPath("~/App_Data"); 
var provider = new MultipartFormDataStreamProvider(root); 
Các vấn đề liên quan