如何使用 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错误处理:如何简化调试

WebApi - 如何响应 Flash 文件并在浏览器中显示

如何将 URL 从 Webapi 传递到 <img> 标签以接受 base64 的图像?

ASP.NET WebApi:如何使用 WebApi HttpClient 通过文件上传执行多部分发布

如何使用 Spring/Servlets 支持批量 Web api 请求处理

如何回答请求但继续在 WebApi 中处理代码