【问题标题】:No images displayed when website called from self written webserver从自写的网络服务器调用网站时不显示图像
【发布时间】:2009-07-14 07:17:43
【问题描述】:

我有 Java 网络服务器(没有标准软件......自行编写)。一切似乎都正常,但是当我尝试调用包含图片的页面时,这些图片不会显示。我必须将带有输出流的图像发送到客户端吗?我错过了一个额外的步骤吗?

由于代码太多,无法在此处发布,这里简要概述一下会发生什么或应该发生什么:

1. client logs in
2. client gets a session id and so on
3. the client is connected with an output stream
4. we built the response with the HTML-Code for a certain 'GET'-request 
5. look what the GET-request is all about
6. send html response || file || image (not working yet)

基本大纲就讲这么多……

它发送 css 文件和东西,但我仍然有图像问题! 有人有想法吗?如何将图像从服务器发送到浏览器? 谢谢。

我用 charles 检查来自客户端的请求和来自服务器的响应。它可以很好地发送文件(如 css 或 js),但不能发送图像:虽然状态是“200 OK”,但传输编码是 chunked ...我不知道这意味着什么!?有人知道吗?

编辑: 下面是文件读取代码:

 try{
      File requestedFile = new File( file );
      PrintStream out = new PrintStream( this.getHttpExchange().getResponseBody() );
      // File wird geschickt:
      InputStream in = new FileInputStream( requestedFile );
      byte content[] = new byte[(int)requestedFile.length()];
      in.read( content );

      try{
           // some header stuff
           out.write( content );
      }
      catch( Exception e ){
           e.printStackTrace();
      }

      in.close();

      if(out!=null){
           out.close();
           System.out.println( "FILE " + uri + " SEND!" );
      }
 }
 catch ( /*all exceptions*/ ) {  
      // catch it ...
 }

【问题讨论】:

  • @ck: 响应是作为字符串的 html 页面......它通过输出流发送回客户端 @Tim: 嗯?
  • 你看到图片请求了吗?
  • @Jack:我确实明白了......设置 Content-type 不同,但我想我处理这些请求的方式错误:)
  • 你能用 Firebug 检查你的网站吗?它应该为您提供详细的页面和网络信息 - 包括发送和接收的数据、标头等。
  • @kd304: 见上文...我检查了 charles 和 firebug ...两者都给了我“传输编码被分块”...

标签: java image file webserver


【解决方案1】:

您的浏览器将向您的服务器发送单独的GET image.png HTTP 1.1 请求,您也应该处理这些文件获取。没有在 HTML 中嵌入和独立于浏览器的图像的好方法,只有 <img src="data:base64codedimage"> 协议处理程序在某些浏览器中可用。

当您创建 HTML 响应时,您可以将外部 js/css 文件的内容直接包含在 <script></script><style></style> 标记之间。

编辑:我建议使用Firebug 进行进一步诊断。

【讨论】:

  • Thnx,之前有人向我提到过 base64 编码(我会调查一下),但这会帮助我处理外部文件,比如样式表(也可能包含图像)吗?谢谢
  • 嘿,我知道了,但我个人认为外部文件要优雅得多,但图片不会。
  • 我的建议是使用外部 js/css 文件并将它们简化为一个响应。最新的FF3和IE8应该可以搞定:看一下rfcietf.org/rfc/rfc2397.txt
【解决方案2】:

您确定为文件发送了正确的 MIME 类型吗?

如果您需要一个小型的开源网络服务器来获得灵感,请查看http://www.acme.com/java/software/Acme.Serve.Serve.html,它可以很好地满足我们的临时服务器需求。

【讨论】:

  • 我更改了类型,它适用于文件(见上文),但不适用于图片。谢谢链接!
【解决方案3】:

我必须发送那些外部文件吗 或带有输出流的图像 客户?

客户端将对这些文件发出单独的请求,您的服务器必须提供这些文件。但是,这些请求可以通过相同的persisten connection(又名keepalive)到达。您的问题最可能的两个原因:

  1. 客户端尝试通过持久连接发送多个请求(这是 HTTP 1.1 的默认设置),而您的服务器未正确处理此问题。避免这种情况的最简单方法是在响应中发送 Connection: close 标头。
  2. 客户端尝试打开单独的连接,而您的服务器未正确处理它。

编辑:

这行有问题:

in.read( content );

此方法不保证填充数组;它将读取任意数量的字节并返回该数字。您必须在循环中使用它以确保读取所有内容。由于无论如何您都必须执行循环,因此最好使用较小的数组作为缓冲区,以避免将整个文件保留在内存中并在大文件时遇到 OutOfMemoryError。

【讨论】:

  • 我认为浏览器倾向于发送 connection: keep-alive 标头,但不要指望服务器会尊重这一点。如果服务端关闭流就好了。
  • 谢谢 :) 我会检查的!
  • 事情是(现在):我可以请求多个文件,例如 css 文件和 js 文件。效果很好,但它不适用于图像:(
  • "doesnt work" 不是有用的错误描述。它究竟是如何“不起作用”的?文件是 HTTP 服务器的文件,对于图像和文本文件没有特殊处理。除非您尝试将所有文​​件作为文本处理并弄乱二进制文件。确保将文件视为字节序列,不要在任何地方使用 Reader 或 Writer。
  • 我使用了 PrintStream ...但不幸的是,我仍然无法使用它来处理图像...如果我尝试对图像进行与 css 文件或 js 文件相同的处理,它不起作用...见上面的代码
【解决方案4】:

可能第 4 步是你出错的地方:

// 4. we built the response with the HTML-Code for a certain 'GET'-request 

一些请求将是“GET /css/styles.css”或“GET /js/main.js”或“GET /images/header.jpg”。确保在这些情况下流式传输这些文件 - 尝试直接加载这些 URL。

【讨论】:

    【解决方案5】:

    浏览器请求图像(和 css/js 文件)作为对页面的完全独立的 GET 请求,因此绝对没有必要“将这些...与输出流一起发送”。因此,如果您的页面服务正常,但没有加载图像,我的第一个猜测是您没有正确设置响应标头(例如,将响应的 Content-Type 设置为 text/html ),因此浏览器不会将其解释为正确的页面,因此不会加载图像。

    如果不起作用,可以尝试其他一些方法:

    • 检查您是否可以直接访问图像
    • 使用诸如 firebug 或 fiddler 之类的东西来检查浏览器是否真的在请求 image/css/js 文件以及所有请求/响应标头是否正常
    • 使用existing web server!

    【讨论】:

    • "使用现有的网络服务器!" --> 是的,我知道 Apache/Tomcat 或 Jetty 或或或……我很想知道,尽管我确实认为从头开始看看它是如何工作的很有趣,这让一些事情变得更加清晰!谢谢你的输入,有道理!我一定会检查的。 (也从未听说过提琴手,谢谢那个提示!)
    • 内容类型是一个问题。至少现在我收到了请求......所以现在我确定,我以错误的方式处理请求:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多