2016-09-09 5 views
0

Multipartアップロードのフィールドを調べ、文字列フィールドの内容に基づいて、添付ファイルを抽出するかどうかを決定します。関連するフィールドの検証の場合にのみ、asp.netのマルチパートファイルが抽出される

カスタムMultiPartFormDataStreamproviderを作成してそこにチェックインするのは合理的ですが、コピーストリームを指すCopyToAsyncでデータをコピーしようとすると、データが取得されません。ストリームはすでに読み込まれているようです。私は間違って何をしていますか?

内部クラスCustomMultipartFormDataStreamProvider:MultipartFormDataStreamProvider { isValidFields _validateFields; 内部CustomMultipartFormDataStreamProvider(文字列パス、isValidFields validateFields):ベース(パス){_validateFields = validateFields; } プライベートreadonlyコレクション_isFormData =新しいコレクション(); // private読み取り専用NameValueCollection _formData =新しいNameValueCollection(StringComparer.OrdinalIgnoreCase); // public NameValueCollection FormData // { // get {return _formData; } //}タスクExecutePostProcessingAsync()のための {非同期 公共オーバーライド(VARインデックス= 0、インデックス< Contents.Count;インデックス++){ IF(IsStream(インデックス)) 続けます。

  var formContent = Contents[index]; 
      var contentDisposition = formContent.Headers.ContentDisposition; 
      var formFieldName = UnquoteToken(contentDisposition.Name) ?? string.Empty; 
      var formFieldValue = await formContent.ReadAsStringAsync(); 
      FormData.Add(formFieldName, formFieldValue); 
     } 
     if (_validateFields != null) 
     { 
      if (_validateFields(FormData) == false) 
      { 
       throw new Exception("Invalid data"); 
      } 
     } 
     for (var index = 0; index < Contents.Count; index++) 
     { 
      if (!IsStream(index)) 
       continue; 

      var formContent = Contents[index]; 
      var contentDisposition = formContent.Headers.ContentDisposition; 
      var formFieldName = UnquoteToken(contentDisposition.Name) ?? string.Empty; 
      FileStream fileStream = null; 
      string pathname = Path.Combine(base.RootPath, Path.GetFileName(GetLocalFileName(formContent.Headers))); 
      using (fileStream = new FileStream(pathname, FileMode.Create, FileAccess.Write, FileShare.None)) 
      { 
       try 
       { 
        await formContent.CopyToAsync(fileStream).ContinueWith((copyTask) => 
        { 
         fileStream.Close(); 
        }); 
       } 
       catch (Exception ex) 
       { 
        throw; 
       } 
      } 
     } 
    } 

    private static string UnquoteToken(string token) 
    { 
     if (string.IsNullOrWhiteSpace(token)) 
      return token; 

     if (token.StartsWith("\"", StringComparison.Ordinal) && token.EndsWith("\"", StringComparison.Ordinal) && token.Length > 1) 
      return token.Substring(1, token.Length - 2); 

     return token; 
    } 

    public bool IsStream(int idx) 
    { 
     return !_isFormData[idx]; 
    } 
    public override Stream GetStream(HttpContent parent, HttpContentHeaders headers) 
    { 
     if (parent == null) throw new ArgumentNullException("parent"); 
     if (headers == null) throw new ArgumentNullException("headers"); 

     var contentDisposition = headers.ContentDisposition; 

     if (contentDisposition != null) 
     { 
      _isFormData.Add(String.IsNullOrEmpty(contentDisposition.FileName)); 
      Stream result = base.GetStream(parent, headers); 
      return result; 
     } 

     throw new InvalidOperationException("Did not find required 'Content-Disposition' header field in MIME multipart body part."); 
    } 
    public override string GetLocalFileName(HttpContentHeaders headers) 
    { 
     return headers.ContentDisposition.FileName.Replace("\"", string.Empty); 
    } 
} 

これは

 if (!Request.Content.IsMimeMultipartContent()) 
     { 
      throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
     } 
     string guid = Guid.NewGuid().ToString(); 
     string fileSaveLocation = HttpContext.Current.Server.MapPath("~/App_Data"); 
     if (subDir.Length > 0) 
      Path.Combine(fileSaveLocation, subDir); 
     fileSaveLocation = Path.Combine(fileSaveLocation, guid); 
     Directory.CreateDirectory(fileSaveLocation); 
     CustomMultipartFormDataStreamProvider provider = new CustomMultipartFormDataStreamProvider(fileSaveLocation, validateFields); 
     try 
     { 
      // Read all contents of multipart message into CustomMultipartFormDataStreamProvider and allow validation of fields 
      await Request.Content.ReadAsMultipartAsync(provider); 

答えて

0

によって呼び出されるファイルにMultipartMemoryStreamProviderをxtractionを使用していいがオフに保持することができ、MultiPartFormDataStreamproviderの機能は複製するが、より多くの制御を有します。

関連する問題