从自写网络服务器调用网站时,不显示图像

时间:2009-07-14 07:17:43

标签: java image file webserver

我有 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文件和东西,但我仍然有图像问题! 有人有想法吗?如何将图像从服务器发送到浏览器? 感谢。

我检查来自客户端的请求以及来自服务器的查询请求。它发送文件(如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 ...
 }

5 个答案:

答案 0 :(得分:3)

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

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

修改:我建议您使用Firebug进行进一步诊断。

答案 1 :(得分:2)

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

如果你需要一个小小的OpenSource网络服务器,那么请看看http://www.acme.com/java/software/Acme.Serve.Serve.html,它可以很好地满足ad-hoc服务器需求。

答案 2 :(得分:1)

可能步骤#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。

答案 3 :(得分:1)

浏览器请求图像(和css / js文件)作为对页面的完全独立的GET请求,因此绝对不需要“使用输出流发送那些......”。因此,如果您正在提供正常的页面,但未加载图像,我的第一个猜测是您没有正确设置响应标头(例如,将响应的Content-Type设置为{ {1}}),因此浏览器不会将其解释为正确的页面&amp;因此不加载图像。

如果不起作用,还可以尝试其他一些事情:

  • 检查您是否可以直接访问图像
  • 使用像firebug或fiddler这样的东西来检查浏览器是否实际上正在请求image / css / js文件&amp;您的所有请求/响应标头看起来都不错
  • 使用existing web server

答案 4 :(得分:1)

  

我是否必须发送这些外部文件   或输出流的图像   客户?

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

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

    这条线存在问题:

    in.read( content );
    

    此方法无法保证填充数组;它将读取任意数量的字节并返回该数字。你必须在循环中使用它以确保所有内容都被读取。因为你必须做一个循环,所以最好使用一个较小的数组作为缓冲区,以避免将整个文件保存在内存中并运行到带有大文件的OutOfMemoryError中。