당신은 그리에이를 수 있습니다 여기에
data.append("myParameter", "test");
여분의 paramater없이 파일 업로드를 처리하는 내 webapi입니다 -에서 다중 부분 콘텐츠의 FormData를 구문 분석하기위한 논리를 복제하는 사용자 지정
DataStreamProvider
을 구현하여 매우 깨끗한 방식으로 처리 할 수 있습니다.
MultipartFormDataStreamProvider
을 MultiPartFileStreamProvider
에서 하위 클래스로 만든 이유는 모르겠지만 적어도 FormData 컬렉션을 식별하고 노출하는 코드를 추출하지 않고도 여러 파트 데이터를 포함하는 많은 작업에 유용하기 때문에 디스크에 파일.
어쨌든 다음 공급자가 문제를 해결하는 데 도움이됩니다. 공급자 콘텐츠를 반복 할 때 파일 이름이없는 항목은 모두 무시해야합니다 (특히 streamProvider.Contents.Select()
성명을 사용하면 formdata를 DB에 업로드 할 위험이 있습니다). 따라서 공급자에게 요청하는 코드는 HttpContent IsStream()입니다.이 코드는 약간 해킹되었지만 가장 간단했습니다.
근본적으로 소스 코드 MultipartFormDataStreamProvider
에서 자르고 붙여 넣기 할 수 있습니다. 엄격한 테스트를 거치지 않았습니다 (this answer에서 영감을 얻음).
public class MultipartFormDataMemoryStreamProvider : MultipartMemoryStreamProvider
{
private readonly Collection<bool> _isFormData = new Collection<bool>();
private readonly NameValueCollection _formData = new NameValueCollection(StringComparer.OrdinalIgnoreCase);
public NameValueCollection FormData
{
get { return _formData; }
}
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));
return base.GetStream(parent, headers);
}
throw new InvalidOperationException("Did not find required 'Content-Disposition' header field in MIME multipart body part.");
}
public override async Task ExecutePostProcessingAsync()
{
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;
var formFieldValue = await formContent.ReadAsStringAsync();
FormData.Add(formFieldName, formFieldValue);
}
}
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];
}
}
(귀하의 질문에 맞게 TPL 구문을 사용하여) 다음과 같이 사용할 수 있습니다 :
[HttpPost]
public Task<string> Post()
{
if (!Request.Content.IsMimeMultipartContent())
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, "Invalid Request!"));
var provider = new MultipartFormDataMemoryStreamProvider();
return Request.Content.ReadAsMultipartAsync(provider).ContinueWith(p =>
{
var result = p.Result;
var myParameter = result.FormData.GetValues("myParameter").FirstOrDefault();
foreach (var stream in result.Contents.Where((content, idx) => result.IsStream(idx)))
{
var file = new FileData(stream.Headers.ContentDisposition.FileName);
var contentTest = stream.ReadAsByteArrayAsync();
// ... and so on, as per your original code.
}
return myParameter;
});
}
나는 다음과 같은 HTML 양식을 테스트 :
<form action="/api/values" method="post" enctype="multipart/form-data">
<input name="myParameter" type="hidden" value="i dont do anything interesting"/>
<input type="file" name="file1" />
<input type="file" name="file2" />
<input type="submit" value="OK" />
</form>
var count = provider.FileData.Count; 오류가 발생합니다 (FileData의 정의가 포함되어 있지 않음)? – renathy
다른 질문 : 예제에서 파일 내용을 가져 오는 방법은 무엇입니까? 어떤 이유로 든 그것을 얻을 수 없습니다. – renathy
공급자 구현과 예제 컨트롤러를 업데이트했습니다. 제발보십시오. – gooid