我有 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 ...
}
答案 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;因此不加载图像。
如果不起作用,还可以尝试其他一些事情:
答案 4 :(得分:1)
我是否必须发送这些外部文件 或输出流的图像 客户?
客户端将对这些文件发出单独的请求,您的服务器必须提供这些文件。但是,这些请求可以通过相同的persisten connection(a.k.a. keepalive)到达。问题的两个最可能原因是:
Connection: close
标头。修改强>
这条线存在问题:
in.read( content );
此方法无法保证填充数组;它将读取任意数量的字节并返回该数字。你必须在循环中使用它以确保所有内容都被读取。因为你必须做一个循环,所以最好使用一个较小的数组作为缓冲区,以避免将整个文件保存在内存中并运行到带有大文件的OutOfMemoryError中。