I'm trying to write a WebApi service that receives a file, does a trivial manipulation, and sends the file back. I'm having issues on sending and/or receiving the file from the service.
我正在尝试编写一个接收文件的WebApi服务,执行一个简单的操作,并将文件发回。我在从服务发送和/或接收文件时遇到问题。
The issue I'm having is that the file returned from the service is ~1.5x larger than the manipulated file, e.g. when the file is returned it's like 300kb instead of the 200kb it should be.
我遇到的问题是从服务返回的文件比操作文件大1.5倍,例如当文件被返回时,它就像300kb而不是它应该是200kb。
I assume its being wrapped and or manipulated somehow, and I'm unsure of how to receive it properly. The code for the WebAPI service and the method that calls the web service are included below
我认为它被包裹或以某种方式操纵,我不确定如何正确地接收它。下面包含WebAPI服务的代码和调用Web服务的方法
In, the WebApi service, when I hit the line return Ok(bufferResult)
, the file is a byte[253312]
在,WebApi服务,当我点击该行返回Ok(bufferResult)时,该文件是一个字节[253312]
In the method that calls the web service, after the file is manipulated and returned, following the line var content = stream.Result;
, the stream has a length of 337754 bytes.
在调用Web服务的方法中,在操作并返回文件之后,在行var content = stream.Result;之后,该流的长度为337754字节。
Web API service code
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);
}
}
Method Calling the Service
方法调用服务
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;
}
I'm still new to streams and WebApi, so I may be missing something quite obvious. Why are the file streams different sizes? (eg. is it wrapped and how do I unwrap and/or receive the stream)
我还是溪流和WebApi的新手,所以我可能会遗漏一些非常明显的东西。为什么文件流的大小不同? (例如,它是否被包裹,如何打开和/或接收流)
1 个解决方案
#1
6
okay, to receive the file correctly, I needed to replace the line
好的,要正确接收文件,我需要更换线路
var stream = response.Content.ReadAsStreamAsync();
with
同
var contents = await response.Content.ReadAsAsync<Byte[]>();
to provide the correct type for the binding
为绑定提供正确的类型
so, the later part of the methods that calls the service looks something like
所以,调用服务的方法的后半部分看起来像
var content = await response.Content.ReadAsAsync<Byte[]>();
var saveStream = new MemoryStream(content);
saveStream.Position = 0;
//Debug: save converted file to disk
/*
var path = @"drive\completed\name.ext";
using (var fileStream = System.IO.File.Create(path))
{
saveStream.CopyTo(fileStream);
}*/
#1
6
okay, to receive the file correctly, I needed to replace the line
好的,要正确接收文件,我需要更换线路
var stream = response.Content.ReadAsStreamAsync();
with
同
var contents = await response.Content.ReadAsAsync<Byte[]>();
to provide the correct type for the binding
为绑定提供正确的类型
so, the later part of the methods that calls the service looks something like
所以,调用服务的方法的后半部分看起来像
var content = await response.Content.ReadAsAsync<Byte[]>();
var saveStream = new MemoryStream(content);
saveStream.Position = 0;
//Debug: save converted file to disk
/*
var path = @"drive\completed\name.ext";
using (var fileStream = System.IO.File.Create(path))
{
saveStream.CopyTo(fileStream);
}*/