我有一个可以通过我的REST API访问的函数,它配置了ASP.NET Web API 2.1,它应该将图像返回给调用者。出于测试目的,我只是让它返回我现在存储在本地计算机上的示例图像。这是方法:
public IHttpActionResult GetImage()
{
FileStream fileStream = new FileStream("C:/img/hello.jpg", FileMode.Open);
HttpContent content = new StreamContent(fileStream);
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/jpeg");
content.Headers.ContentLength = fileStream.Length;
return Ok(content);
}
当调用此方法时,我根本没有得到图像。以下是我收到的回复:
{ “接头”:[{ “密钥”: “内容类型”, “值”:[ “图像/ JPEG”]},{ “密钥”: “内容长度”, “值”:[” 30399" ]}]}
为什么我没有将图像数据作为请求的一部分返回?怎么能解决?
答案 0 :(得分:27)
一种可能性是编写自定义IHttpActionResult
来处理您的图片:
public class FileResult : IHttpActionResult
{
private readonly string filePath;
private readonly string contentType;
public FileResult(string filePath, string contentType = null)
{
this.filePath = filePath;
this.contentType = contentType;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
return Task.Run(() =>
{
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StreamContent(File.OpenRead(filePath))
};
var contentType = this.contentType ?? MimeMapping.GetMimeMapping(Path.GetExtension(filePath));
response.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType);
return response;
}, cancellationToken);
}
}
您可以在Web API控制器操作中使用:
public IHttpActionResult GetImage()
{
return new FileResult(@"C:\\img\\hello.jpg", "image/jpeg");
}
答案 1 :(得分:4)
除了@Darin提到的内容之外,您使用的Ok<T>(T content)
帮助程序实际上返回OkNegotiatedContentResult<T>
,其名称表示运行内容协商。由于您不希望在这种情况下进行内容协商,因此您需要创建自定义操作结果。
以下是您如何做到这一点的一个示例: http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/ActionResults/ActionResults/Results/OkFileDownloadResult.cs
答案 2 :(得分:-1)
您可以按以下代码下载文件:
HttpResponse response = HttpContext.Current.Response;
response.Clear();
response.Buffer = false;
response.BufferOutput = false;
response.Charset = "UTF-8";
response.ContentEncoding = System.Text.Encoding.UTF8;
response.AppendHeader("Content-disposition", "attachment; filename=" + fileName);
response.Write(excelXml);
response.Flush();
response.End();
HttpContext.Current.Response.End();
答案 3 :(得分:-1)
您可以使用以下代码从web api下载文件:
HttpResponseMessage objResponse = Request.CreateResponse(HttpStatusCode.OK);
objResponse.Content = new StreamContent(new FileStream(HttpContext.Current.Server.MapPath("~/FolderName/" + FileName), FileMode.Open, FileAccess.Read));
objResponse.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
objResponse.Content.Headers.ContentDisposition.FileName = FileName;
return objResponse;