【发布时间】:2013-12-29 01:55:07
【问题描述】:
我正在尝试编写一个 WebApi 服务来接收文件,进行简单的操作,然后将文件发回。我在从服务发送和/或接收文件时遇到问题。
我遇到的问题是从服务返回的文件比操作文件大 1.5 倍,例如当文件被返回时,它就像 300kb 而不是应该的 200kb。
我假设它以某种方式被包装和/或操纵,我不确定如何正确接收它。下面是WebAPI服务的代码和调用Web服务的方法
在WebApi服务中,当我点击return Ok(bufferResult)这一行时,文件是byte[253312]
在调用web服务的方法中,文件被操作返回后,遵循var content = stream.Result;这一行,流的长度为337754字节。
Web API 服务代码
public ConversionController: APIController{
public async Task<IHttpActionResult> TransformImage()
{
if (!Request.Content.IsMimeMultipartContent())
throw new Exception();
var provider = new MultipartMemoryStreamProvider();
await Request.Content.ReadAsMultipartAsync(provider);
var file = provider.Contents.First();
var filename = file.Headers.ContentDisposition.FileName.Trim('\"');
var buffer = await file.ReadAsByteArrayAsync();
var stream = new MemoryStream(buffer);
// [file manipulations omitted;]
// [the result is populated into a MemoryStream named response ]
//debug : save memory stream to disk to make sure tranformation is successfull
/*response.Position = 0;
path = @"C:\temp\file.ext";
using (var fileStream = System.IO.File.Create(path))
{
saveStream.CopyTo(fileStream);
}*/
var bufferResult = response.GetBuffer();
return Ok(bufferResult);
}
}
方法调用服务
public async Task<ActionResult> AsyncConvert()
{
var url = "http://localhost:49246/api/conversion/transformImage";
var filepath = "drive/file/path.ext";
HttpContent fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(filepath));
using (var client = new HttpClient())
{
using (var formData = new MultipartFormDataContent())
{
formData.Add(fileContent, "file", "fileName");
//call service
var response = client.PostAsync(url, formData).Result;
if (!response.IsSuccessStatusCode)
{
throw new Exception();
}
else
{
if (response.Content.GetType() != typeof(System.Net.Http.StreamContent))
throw new Exception();
var stream = response.Content.ReadAsStreamAsync();
var content = stream.Result;
var path = @"drive\completed\name.ext";
using (var fileStream = System.IO.File.Create(path))
{
content.CopyTo(fileStream);
}
}
}
}
return null;
}
我对流和 WebApi 还很陌生,所以我可能遗漏了一些非常明显的东西。为什么文件流大小不同? (例如,它是否已包装以及如何打开和/或接收流)
【问题讨论】:
标签: asp.net-mvc asp.net-web-api filestream