构建 HTTP 响应 Header
Building an HTTP Response Header
正在尝试从头开始构建 Web 服务器。它适用于 html 和其他纯文本文件。在 Firefox 和 Chrome 中测试。但是我很难让图像正确显示。返回状态 200,在 Firefox 中,我根据请求获得了附加图像。除了响应 header,我是否需要使用打印流以不同方式处理图像文件类型?
FileInputStream fileIn = new FileInputStream("test/" +
file);
// split specified file path
String[] pathTokens = tokens[1].split("/|\.");
String fileExt = pathTokens[tokens.length - 1];
// build response
out.println("HTTP/1.1 200 OK");
if(fileExt.equals("jpg") || fileExt.equals("jpeg") ||fileExt.equals("png") ||
fileExt.equals("ico"))
out.println("Content type: image/" + fileExt);
else
out.print("Content type: text/");
if(fileExt.equals("html"))
out.println(fileExt);
else
out.println("plain");
long size = fileIn.getChannel().size();
out.println("Content-Length: " + Long.toString(size));
out.println("Connect: Close");
out.println("");
int read = 0;
byte[] buffer = new byte[1024];
while ((read = fileIn.read(buffer)) != -1){
out.write(buffer, 0, read);
}
如果需要任何进一步的信息,请索取。我非常愿意提供任何其他详细信息,或回答我能回答的任何问题。
编辑:经过进一步检查,我实际上在 Firefox 中得到了 404,我不太确定 Chrome 是什么,显示的页面是 "This site cannot be reached...",但看起来我是得到 200 返回。
我想我可以看到一个错误:
if(fileExt.equals("jpg") || fileExt.equals("jpeg") ||fileExt.equals("png") ||
fileExt.equals("ico"))
out.println("Content type: image/" + fileExt);
else
out.print("Content type: text/");
if(fileExt.equals("html"))
out.println(fileExt);
else
out.println("plain");
如果我 re-indent 并在 Java 编译器认为应该插入的位置插入 {}。
if (fileExt.equals("jpg") || fileExt.equals("jpeg") ||
fileExt.equals("png") || fileExt.equals("ico")) {
out.println("Content type: image/" + fileExt);
} else {
out.print("Content type: text/");
}
if (fileExt.equals("html")) {
out.println(fileExt);
} else {
out.println("plain");
}
看到问题了吗?如果扩展名是(比如)"jpg",您将在 header.
中添加一个虚假的 "plain" 行
我认为你实际上打算写这个:
if (fileExt.equals("jpg") || fileExt.equals("jpeg") ||
fileExt.equals("png") || fileExt.equals("ico")) {
out.println("Content type: image/" + fileExt);
} else {
out.print("Content type: text/");
if (fileExt.equals("html")) {
out.println(fileExt);
} else {
out.println("plain");
}
}
这说明:
- 让您的代码缩进与代码 实际 所说相符的重要性。 (提示:使用您的 IDE 的 auto-indentation 功能!)
- 您应该养成在所有控制结构中始终使用花括号块的习惯。
- 重新发明轮子不是一个好主意。除非你喜欢修理坏掉的轮子。
正在尝试从头开始构建 Web 服务器。它适用于 html 和其他纯文本文件。在 Firefox 和 Chrome 中测试。但是我很难让图像正确显示。返回状态 200,在 Firefox 中,我根据请求获得了附加图像。除了响应 header,我是否需要使用打印流以不同方式处理图像文件类型?
FileInputStream fileIn = new FileInputStream("test/" +
file);
// split specified file path
String[] pathTokens = tokens[1].split("/|\.");
String fileExt = pathTokens[tokens.length - 1];
// build response
out.println("HTTP/1.1 200 OK");
if(fileExt.equals("jpg") || fileExt.equals("jpeg") ||fileExt.equals("png") ||
fileExt.equals("ico"))
out.println("Content type: image/" + fileExt);
else
out.print("Content type: text/");
if(fileExt.equals("html"))
out.println(fileExt);
else
out.println("plain");
long size = fileIn.getChannel().size();
out.println("Content-Length: " + Long.toString(size));
out.println("Connect: Close");
out.println("");
int read = 0;
byte[] buffer = new byte[1024];
while ((read = fileIn.read(buffer)) != -1){
out.write(buffer, 0, read);
}
如果需要任何进一步的信息,请索取。我非常愿意提供任何其他详细信息,或回答我能回答的任何问题。
编辑:经过进一步检查,我实际上在 Firefox 中得到了 404,我不太确定 Chrome 是什么,显示的页面是 "This site cannot be reached...",但看起来我是得到 200 返回。
我想我可以看到一个错误:
if(fileExt.equals("jpg") || fileExt.equals("jpeg") ||fileExt.equals("png") ||
fileExt.equals("ico"))
out.println("Content type: image/" + fileExt);
else
out.print("Content type: text/");
if(fileExt.equals("html"))
out.println(fileExt);
else
out.println("plain");
如果我 re-indent 并在 Java 编译器认为应该插入的位置插入 {}。
if (fileExt.equals("jpg") || fileExt.equals("jpeg") ||
fileExt.equals("png") || fileExt.equals("ico")) {
out.println("Content type: image/" + fileExt);
} else {
out.print("Content type: text/");
}
if (fileExt.equals("html")) {
out.println(fileExt);
} else {
out.println("plain");
}
看到问题了吗?如果扩展名是(比如)"jpg",您将在 header.
中添加一个虚假的 "plain" 行我认为你实际上打算写这个:
if (fileExt.equals("jpg") || fileExt.equals("jpeg") ||
fileExt.equals("png") || fileExt.equals("ico")) {
out.println("Content type: image/" + fileExt);
} else {
out.print("Content type: text/");
if (fileExt.equals("html")) {
out.println(fileExt);
} else {
out.println("plain");
}
}
这说明:
- 让您的代码缩进与代码 实际 所说相符的重要性。 (提示:使用您的 IDE 的 auto-indentation 功能!)
- 您应该养成在所有控制结构中始终使用花括号块的习惯。
- 重新发明轮子不是一个好主意。除非你喜欢修理坏掉的轮子。