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);