2011-11-23 90 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