我有Web API来上传沿请求正文发送的单个文件。我有以下代码从流
中读取文件二进制文件Task<HttpResponseMessage> task = Request.Content.ReadAsStreamAsync().ContinueWith<HttpResponseMessage>(t =>
{
if (t.IsFaulted || t.IsCanceled)
throw new HttpResponseException(HttpStatusCode.InternalServerError);
try
{
using (Stream stream = t.Result)
{
using (MemoryStream ms = new MemoryStream())
{
stream.Seek(0, SeekOrigin.Begin);
stream.CopyTo(ms);
byte[] fileBinaries = ms.ToArray();
//logic to process the file
}
}
}
catch (Exception e)
{
//exception handling logic
}
return Request.CreateResponse(HttpStatusCode.Created);
});
return task;
在上传文件时调用API工作正常;并返回Http状态码 201 。但是,如果我没有将文件附加到API调用仍然返回相同的代码,因为没有检查收到的二进制数据。我想添加该检查以向用户返回相应的错误消息。
我尝试通过评估从Request.Content读取的fileBinaries字节数组的长度来执行此检查。但是数组中的字节很少,代表文本 [object FileList] (不知道这个字节是如何在数组中填充的,因为我还没有用API附加任何文件呼叫)。所以这对我不起作用。
我也尝试使用 HttpContext.Current.Request.Files.Count ,但它总是返回0(可能是由于请求体中发送的文件二进制文件)所以不适合我的检查。
我不能依赖任何标题,例如文件名,因为这些标题未在请求中发送。
任何帮助如何执行此操作?
答案 0 :(得分:0)
尝试使用MultipartMemoryStreamProvider,这是使用webapi上传文件的理想选择
public async Task<IHttpActionResult> UploadFile()
{
var filesReadToProvider = await Request.Content.ReadAsMultipartAsync();
foreach (var stream in filesReadToProvider.Contents)
{
var fileBytes = await stream.ReadAsByteArrayAsync();
}
}
这里fileBytes可能没有那17个字节。