我的问题是我无法让非文本文件在浏览器中正确显示。在我的服务器的代码中,我使用 while 循环来监听请求。当请求到来时,我将 header 读入变量 headers
中。之后,我检查该请求是否是 GET 请求。如果是,那么我检查该文件是否存在并且它是一个文件而不是目录。然后,我查看文件的扩展名以确定 HTTP 响应中的下一行。
pw.print("HTTP/1.1 Status: 200 OK\r\n");
String ext = file.getName().substring( file.getName().lastIndexOf('.') + 1, file.getName().length() );
if(ext.equals("txt"))
{
pw.print("Content-Type: text/plain\r\n\r\n");
}
else if(ext.equals("html"))
{
pw.print("Content-Type: text/html\r\n\r\n");
}
else if(ext.equals("jpg"))
{
pw.print("Content-Type: image/jpeg\r\n\r\n");
}
else if(ext.equals("png"))
{
pw.print("Content-Type: image/png\r\n\r\n");
}
else if(ext.equals("pdf"))
{
pw.print("Content-Type: application/pdf\r\n\r\n");
}
if( !ext.equals("txt") && !ext.equals("html") )
{
ImageInputStream imageStream = ImageIO.createImageInputStream(file);
BufferedImage bufferedImage = ImageIO.read(file);
ImageIO.write(bufferedImage, ext, socket.getOutputStream());
}
现在,据我所知,一旦进入最后一个条件(我正在请求 localhost:port/my_png.png
),那么内容应该写入套接字,因为我告诉它它的 Content-Type
应该是什么,浏览器应该能够解释该文件。不幸的是,这并没有发生。我在浏览器中得到字节文本输出。我的输出看起来像这样:
‰PNG
���
IHDR���i���`���‘ïË¥��%IDATxÚíœ=h#×úÆ]ÜBE
有人知道我为什么会遇到这个问题吗?
最佳答案
@morgano:是的,在写入socket
之前我需要pw.flush()
。非常感谢。
关于java - Home Brew Java HTTP 服务器无法正确提供非文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25827173/