我一直在试图使用ASP.NET Web API返回图像。我见过很多例子,但我一直遇到问题。
搜索解决方案后,大多数示例建议使用HttpResponseMessage并正确设置Content和Content-Type标头。例如,在以下帖子中: WebApi: How to handle Images ASP .Net Web API downloading images as binary
这就是我现在正在做的事情:
[System.Web.Http.HttpGet]
[ActionName("ConvertHTMLToImage")]
public HttpResponseMessage ConvertHTMLToImage(string htmlString)
{
var path = @"C:\temp\mona-lisa.png";
var response = Request.CreateResponse(HttpStatusCode.OK);
var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
response.Content = new StreamContent(fileStream);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");
return response;
}
我的结果好坏参半。当我访问该资源的URL时,我遇到Chrome问题(此网页不可用),Firefox(连接已重置)和Safari(Safari无法打开该页面)。令我惊讶的是,它在IE中运行良好。我也可以使用Fiddler中的作曲家成功查看图像。如果我保持Fiddler打开并使用Chrome / Firefox / Safari访问资源,我会看到504错误。不知道是什么意思,我记不起以前曾见过那种错误类型。
我还注意到调试器中有一些奇怪的行为,浏览器无效。如果我从IE和Fiddler调用ConvertHTMLToImage,我看到它在我的断点处停止一次,然后图像成功返回给客户端。在Chrome / Firefox / Safari上,该方法有多个调用。有时两次有时3次。我对此没有任何解释。除了浏览器没有显示图像之外,我没有得到任何我能检测到的错误。
我使用aspx页面,HttpHhandlers和其他.NET方法完成了同样的事情,所以我知道有解决办法,但我真的想知道我做错了什么。这似乎应该可以使用Web API轻松完成。
答案 0 :(得分:2)
这为我解决了问题WebApi: How to handle Images
简而言之
[System.Web.Http.HttpGet]
[ActionName("ConvertHTMLToImage")]
public HttpResponseMessage ConvertHTMLToImage()
{
string filePath = @"C:\temp\mona-lisa.png";
var result = new HttpResponseMessage(HttpStatusCode.OK);
FileStream fileStream = new FileStream(filePath, FileMode.Open);
Image image = Image.FromStream(fileStream);
MemoryStream memoryStream = new MemoryStream();
image.Save(memoryStream, ImageFormat.Jpeg);
result.Content = new ByteArrayContent(memoryStream.ToArray());
result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
return result;
}
答案 1 :(得分:0)
我最近在我的项目中使用了这个:
public HttpResponseMessage Get(int IRN)
{
try
{
Multimedia image = new Multimedia();
MemoryStream imageStream = image.GetMedia(IRN);
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StreamContent(imageStream);
response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/jpeg");
return response;
}
catch (Exception ex)
{
return HandleError(ex);
}
}
GetMedia function:
.....
MemoryStream mediaStream = new MemoryStream();
...
FileStream temp = resource["file"] as FileStream;
mediaStream.SetLength(temp.Length);
temp.Read(mediaStream.GetBuffer(), 0, (int)temp.Length);
temp.Close();
....
return mediaStream;
resource [“file”]是一个包含文件流对象的数组。
希望这有帮助。
答案 2 :(得分:0)
试试这个(根据需要用png替换jpg):
var result = new HttpResponseMessage(HttpStatusCode.OK);
String filePath = HostingEnvironment.MapPath("~/Images/123.jpg");
FileStream fileStream = new FileStream(filePath, FileMode.Open);
Image image = Image.FromStream(fileStream);
MemoryStream memoryStream = new MemoryStream();
image.Save(memoryStream, ImageFormat.Jpeg);
var byteArrayContent = new ByteArrayContent(memoryStream.ToArray());
byteArrayContent.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
result.Content = byteArrayContent;
return result;