草庐IT

java - 浏览器显示 jpeg 的原始图像数据。我应该确保响应中包含哪些 header ?

coder 2024-03-04 原文

我似乎遇到了一个有趣的问题,只要我的 Controller 的 URL 设置为 IMG 标签的 SRC,浏览器就会愉快地显示由我的 Spring MVC Web 应用程序生成的图像,但在直接导航时显示二进制数据到 URL。

我的 Spring MVC Controller 生成了一些 BufferedImage (缩略图),将其转换为 byte[]并使用 @ResponseBody 将其直接返回到响应正文中 Controller 方法上的注释。我注册了org.springframework.http.converter.ByteArrayHttpMessageConverter带有 AnnotationMethodHandlerAdapter 的消息转换器甚至设置它的 supportedMediaTypes属性(property)image/jpeg ,这并没有真正帮助,所以我在 Controller 方法中手动设置响应的 Content-Type header 。

<img src="/images/thumbnail?id=1234" />

工作正常并显示图像,但是直接导航到图像的 SRC(或右键单击图像并选择查看图像)最终显示图像的原始数据。

根据 Firebug,从对此类 URL (http://localhost:8888/images/thumbnail?id=F0snPkvwhtDbl8eutbuq) 的请求中收到的响应 header 是:

HTTP/1.1 200 OK
Expires: Wed, 21 Dec 2011 12:39:07 GMT
Cache-Control: max-age=2592000
Content-Type: image/jpeg
Content-Length: 6998
Server: Jetty(6.1.10)

最后一句话:在 Firebug 中,单击 Response 选项卡会显示图像 :-) 我错过了什么?我认为浏览器接收到内容类型和内容长度 header ,知道需要 jpeg 图像,接收 jpeg 的原始数据,然后在空的浏览器选项卡中显示 jpeg。 FF 和 Chrome 以某种方式显示接收到的原始图像数据。

我正在使用的代码:

@RequestMapping(value = "thumbnail", method = { RequestMethod.GET })
@ResponseBody
public byte[] getImageThumbnail(@RequestParam("id") String documentId, HttpServletResponse response) {
    try {
        Document document = documentService.getDocumentById(documentId);
        InputStream imageInputStream = new FileInputStream(document.getUri());
        response.setContentType("image/jpeg");

        BufferedImage img = ImageIO.read(imageInputStream);
        ResampleOp resampleOp = new ResampleOp(THUMBNAIL_DIMENSION);
        BufferedImage thumbnail = resampleOp.filter(img, null);
        return getDataFromBufferedImage(thumbnail);
    } catch (Throwable t) {
        return null; //return no data if document not found or whatever other issues are encountered
    }
}

private byte[] getDataFromBufferedImage(BufferedImage thumbnail) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        ImageIO.write(thumbnail, "jpg", baos);
        baos.flush();
        return baos.toByteArray();
    } finally {
        baos.close();
    }
}

===更新=== 我听从了@BalusC 的建议,并将生成缩略图的 url 更改为看起来像实际的 .jpg 文件。这有所不同,因为现在我可以“将图像另存为”,文件名不再只是“缩略图”,而是“.jpg”,这很好。但是,Chrome 和 FF(我什至还没有开始在 IE 上进行测试)在将 URL 加载到新的选项卡/窗口中时都会显示原始 JFIF 数据。尽管如此,图像仅在 URL 位于 IMG 标签的 SRC 属性中并且(由于浏览器缓存)当用户选择在新选项卡中查看图像时显示(但仅当用户不刷新选项卡时,刷新选项卡将重新获取JPEG 并在窗口中显示原始数据)。

编辑 我刚刚在 IE9 中对此进行了测试,这是唯一可以按预期工作的浏览器。我可以直接导航到 URL 并不断刷新页面,我可以看到我的 Controller 被点击并且 JPEG 被加载到浏览器窗口中。出色的。现在弄清楚 FF/CR 处理我发送的 JPEG 的方式有什么问题。

附加信息 我正在使用 Spring 版本 3.0.6.RELEASE 从 Jetty 运行网络应用

编辑 我通过使用 @ResponseBody 解决了我的问题和 BytArrayHttpMessageConverter - 我尝试了 SO 上另一个线程中提出的解决方法 - 那就是将字节直接写入响应输出流:IOUtils.copy(imageInputStream, response.getOutputStream());这很简单并且有效,我仍然很好奇浏览器如何在 <img> 中加载响应的奇怪问题是什么标记但不直接在浏览器窗口中。任何人都可以对此有更多的了解,我真的很想知道更多。我暂时不回答这个问题。

最佳答案

尝试将注释更新为:

@RequestMapping(value = "thumbnail", method = { RequestMethod.GET }, produces = {"image/jpeg"})    
@ResponseBody

注意 produces 属性。

希望对您有所帮助。

关于java - 浏览器显示 jpeg 的原始图像数据。我应该确保响应中包含哪些 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8212017/

有关java - 浏览器显示 jpeg 的原始图像数据。我应该确保响应中包含哪些 header ?的更多相关文章

  1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  4. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  5. ruby-on-rails - link_to 不显示任何 rails - 2

    我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article

  6. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  7. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  8. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  9. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  10. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

随机推荐