如何使用web api发布和接收文件

本文关键字:文件 何使用 web api | 更新日期: 2023-09-27 18:26:08

我有一个Api-Post方法,我希望它能够接受任何文件类型,看起来像这样:

[HttpPost]
    public async Task<IHttpActionResult> Post()
    {
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }
        var provider = new MultipartMemoryStreamProvider();
        await Request.Content.ReadAsMultipartAsync(provider);
        if (provider.Contents.Count != 1)
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest,
                "You must include exactly one file per request."));
        }
        var file = provider.Contents[0];
        var filename = file.Headers.ContentDisposition.FileName.Trim(''"');
        var buffer = await file.ReadAsByteArrayAsync();
  }

当我试图在fiddler中发布图像时,这是有效的。然而,我正在编写一个客户端库,我有一个看起来像这样的方法:

        public string PostAttachment(byte[] data, Uri endpoint, string contentType)
    {
        var request = (HttpWebRequest)WebRequest.Create(endpoint);
        request.Method = "POST";
        request.ContentType = contentType;
        request.ContentLength = data.Length;
        var stream = request.GetRequestStream();
        stream.Write(data, 0, data.Length);
        stream.Close();
        var response = (HttpWebResponse) request.GetResponse();
        using (var reader = new StreamReader(response.GetResponseStream()))
        {
           return reader.ReadToEnd();
        }            
    }

每当我试图用这个发布图片时,我都会收到一个UnportedMediaType错误。我想这是因为我的图像不是多部分内容?有没有一种简单的方法来提出正确类型的请求?

如果我必须更改我的web api post方法,有没有一种简单的方法可以做到这一点,而无需将文件写入服务器并保存在内存中?

如何使用web api发布和接收文件

System.Net.Http命名空间中的MultipartFormDataContent将允许您发布多部分表单数据。

private async Task<string> PostAttachment(byte[] data, Uri url, string contentType)
{
  HttpContent content = new ByteArrayContent(data);
  content.Headers.ContentType = new MediaTypeHeaderValue(contentType); 
  using (var form = new MultipartFormDataContent())
  {
    form.Add(content);
    using(var client = new HttpClient())
    {
      var response = await client.PostAsync(url, form);
      return await response.Content.ReadAsStringAsync();
    }
  }
}