如何使用 WebAPI 处理图像
Posted
技术标签:
【中文标题】如何使用 WebAPI 处理图像【英文标题】:How to handle Images using WebAPI 【发布时间】:2013-10-01 02:36:02 【问题描述】:问题
将图像 POST/GET 到我的服务有哪些不同的方法?我想我可以在 JSON 中使用 Base-64 文本,也可以保持原生二进制。我的理解是,通过将图像转换为文本,可以显着增加包的大小。
如果我发送图像(从 Web 表单、本地客户端、其他服务),我应该添加图像控制器/处理程序还是使用格式化程序?这甚至是一个非此即彼的问题吗?
我研究并发现了许多相互竞争的例子,但我不确定我应该朝着哪个方向前进。
是否有网站/博客文章列出了这方面的利弊?
【问题讨论】:
我认为您概述的所有方法都是有效的,但就您的问题而言,它过于开放。您想要的方法至少取决于您支持的客户端类型(表单 POST 和 AJAX 客户端将限制格式、支持压缩等)以及您想对服务器上的图像做什么。我认为,如果您实际上想在 Web API 方法中加载和操作它们,那么您只需要一个 MediaTypeFormatter,即使那样,您也不应该需要一个。如果您只想将它们保存到文件中,那么您绝对不需要。 TL;DR 我认为你应该缩小你的要求,使问题更容易回答。事实上,它要么会无所适从,要么会因为过于宽泛或过于主观而被搁置。 【参考方案1】:我做了一些研究,你可以在这里看到我提出的实现:http://jamessdixon.wordpress.com/2013/10/01/handling-images-in-webapi/
【讨论】:
杰米,你能修复链接吗? 很好的链接,我期待看到天蓝色存储的实现。 代码有错误,这段代码不允许同时读取两张图片。它应该是这样的: FileStream s2 = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read); 一旦链接断开,这个答案就没用了。 首先,你是一个救星。我让这个工作没有任何问题。只有一件事,不要忘记关闭你的 FileStream。第二次请求文件时,它不会通过,因为它正在被“进程”使用。除此之外,很棒的帖子。【参考方案2】:为了保护 - 以下是 Jamie 博客所说的概要:
使用控制器:
获取:
public HttpResponseMessage Get(int id)
var result = new HttpResponseMessage(HttpStatusCode.OK);
String filePath = HostingEnvironment.MapPath("~/Images/HT.jpg");
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;
删除:
public void Delete(int id)
String filePath = HostingEnvironment.MapPath("~/Images/HT.jpg");
File.Delete(filePath);
帖子:
public HttpResponseMessage Post()
var result = new HttpResponseMessage(HttpStatusCode.OK);
if (Request.Content.IsMimeMultipartContent())
//For larger files, this might need to be added:
//Request.Content.LoadIntoBufferAsync().Wait();
Request.Content.ReadAsMultipartAsync<MultipartMemoryStreamProvider>(
new MultipartMemoryStreamProvider()).ContinueWith((task) =>
MultipartMemoryStreamProvider provider = task.Result;
foreach (HttpContent content in provider.Contents)
Stream stream = content.ReadAsStreamAsync().Result;
Image image = Image.FromStream(stream);
var testName = content.Headers.ContentDisposition.Name;
String filePath = HostingEnvironment.MapPath("~/Images/");
//Note that the ID is pushed to the request header,
//not the content header:
String[] headerValues = (String[])Request.Headers.GetValues("UniqueId");
String fileName = headerValues[0] + ".jpg";
String fullPath = Path.Combine(filePath, fileName);
image.Save(fullPath);
);
return result;
else
throw new HttpResponseException(Request.CreateResponse(
HttpStatusCode.NotAcceptable,
"This request is not properly formatted"));
【讨论】:
以上是关于如何使用 WebAPI 处理图像的主要内容,如果未能解决你的问题,请参考以下文章
WebApi - 如何响应 Flash 文件并在浏览器中显示
如何将 URL 从 Webapi 传递到 <img> 标签以接受 base64 的图像?
ASP.NET WebApi:如何使用 WebApi HttpClient 通过文件上传执行多部分发布