文件上载Web API

时间:2018-05-07 07:40:23

标签: c# asp.net-web-api

我有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(可能是由于请求体中发送的文件二进制文件)所以不适合我的检查。

我不能依赖任何标题,例如文件名,因为这些标题未在请求中发送。

任何帮助如何执行此操作?

1 个答案:

答案 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个字节。