2011-11-23 5 views
2

업로드 된 XML 파일을 파일 대신 문자열로 읽는 데 문제가 있습니다.멀티 파트 파일 업로드에서 메모리 내용 읽기

제 문제는 스트림 (var stream = part.ContentReadStream)에 액세스하려고 시도 할 때 닫힙니다. 닫힌 파일 스트림에 액세스하고 있다고 느낍니다. MultipartFormDataStreamProvider를 잘못 사용하고 있습니까? 파일 크기는 몇 킬로바이트에 불과하므로 문제가되지 않습니다.

[WebInvoke(Method = "POST", UriTemplate = "{importFile}")] 
    public HttpResponseMessage Upload(string importFile, HttpRequestMessage request) 
    { 
     if (!request.Content.IsMimeMultipartContent()) 
     { 
      throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
     } 

     // Create a stream provider for setting up output streams 
     MultipartFormDataStreamProvider streamProvider = new MultipartFormDataStreamProvider(); 

     // Read the MIME multipart content using the stream provider we just created. 
     var task = request.Content.ReadAsMultipartAsync(streamProvider); 
     task.Wait(); 
     IEnumerable<HttpContent> bodyparts = task.Result; 
     string submitter; 
     if (!bodyparts.TryGetFormFieldValue("submitter", out submitter)) 
     { 
      submitter = "unknown"; 
     } 

     // Get list of local file names from stream provider 
     IDictionary<string, string> bodyPartFileNames = streamProvider.BodyPartFileNames; 


     var parser = this.parserFactoryFactory.CreateParser(); 
     foreach (var part in bodyparts) 
     { 
      using (var stream = part.ContentReadStream) 
      { 
       using (var streamReader = new StreamReader(stream)) 
       { 
        string content = streamReader.ReadToEnd(); 
        var results = parser.Parse(content); 
       } 
      } 
     } 
     return new HttpResponseMessage(HttpStatusCode.Accepted); 
    } 

은 내 게시물

<h3>Data import test</h3> 

<form action="/api/data/Upload" enctype="multipart/form-data" method="POST"> 
    <input type="file" name="importFile"/> 
    <input type="submit" value="Upload"/> 
</form> 

답변

3

이 솔루션은 실제로 매우 간단하다. MultipartFormDataStreamProvider는 파일을 다루지 않을 때 필요하지 않습니다. 제 경우에는 아주 원활하게 작동합니다.

[WebInvoke(Method = "POST", UriTemplate = "{importFile}")] 
public HttpResponseMessage Upload(
    string importFile, HttpRequestMessage request) 
{ 
    if (!request.Content.IsMimeMultipartContent()) 
     throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 

    // Read the MIME multipart content 
    var task = request.Content.ReadAsMultipartAsync();    
    task.Wait(); 

    IEnumerable<HttpContent> bodyparts = task.Result; 
    string submitter; 
    if (!bodyparts.TryGetFormFieldValue("submitter", out submitter)) 
     submitter = "unknown"; 

    var parser = this.parserFactoryFactory.CreateParser(); 
    foreach (var part in bodyparts) 
    { 
     using (var stream = part.ContentReadStream) 
     { 
      using (var streamReader = new StreamReader(stream)) 
      { 
       string content = streamReader.ReadToEnd(); 
       var results = parser.Parse(content); 
       if (results.IsValid) 
        // do something 
      } 
     } 
    } 
    var message = new HttpResponseMessage(HttpStatusCode.Accepted); 
    return message; 
} 
+4

이 경우에도 컴파일이 수행됩니까? task.Result는 MultipartMemoryStreamProvider입니다. IEnumerable에 캐스팅하는 방법은 입니까? 나는 그것이 과제가되어야한다고 생각한다. 결과. 내용 –

+0

질문이 답변 된 지 오래되었다. 불행히도 지금은 확인할 수 없습니다. 여전히 유효한 솔루션입니다. – Tx3

+0

'this.parserFactoryFactory.CreateParser();는 무엇을하고 있습니까? – StuperUser