我正试图在一个项目中实现http/1.0,该项目的网站加载了我编写的serversocket。它适用于基于字符的文件。但是对于我指定返回base64编码版本的图像文件,即使设置了正确的头文件,例如 content-type: image/png
以及 content-transfer-encoding: base64
rfc 2045。我试着查看chrome网络工具的数据包,它看起来像是把它当作一个文档事件,尽管它是一个图像文件。自从我被困在这个问题上几天以来,我什么都不知道该做!我搜索了所有的stackoverflow,所有的google,我基本上被卡住了。我在一两天前发布了这个问题,当时有人建议在没有运气的情况下使用字节读取器(我也尝试过)。任何视觉输入都是非常有价值的。
我有两种方法是相关的。
第一种是我根据文件是图像还是文本来选择读取文件的方式。
public String readUri(String reqUri) {
returnFile = "";
if (this.fileExists(reqUri)) {
fileType = this.fileType(reqUri); // returns e.g image from image/png
if (fileType.equals("text")) {
// bufferedreader ...
} else if (fileType.equals("image")) {
File imgPath = new File(reqUri);
try {
FileInputStream fileInputStreamReader = new FileInputStream(imgPath);
byte[] bytes = new byte[(int)imgPath.length()];
fileInputStreamReader.read(bytes);
returnFile = Base64.getEncoder().encodeToString(bytes);
fileInputStreamReader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return returnFile;
}
第二个从上述方法收集数据。这个方法在我的get请求控制器中被调用,并通过serversocket将数据发送回客户机。
StringBuilder response = new StringBuilder();
public String response(
String HTTPVersion, int statusCode, String fileContent, String contentType) {
response.append(
HTTPVersion + " " +
statusCode + " " +
this.getHTTPStatusText(statusCode) + "\n"
);
response.append("Content-transfer-encoding: BASE64");
response.append("Content-Type: " + contentType + "\n");
response.append("content-length: " + fileContent.length() + "\n");
response.append("Date: " + date() + "\n");
response.append("\n");
response.append(fileContent + "\n");
return response.toString();
}
以下是chromes网络工具的请求/响应:
这是当前使用base64编码加载图像的方式:
1条答案
按热度按时间cczfrluj1#
http不是mime
rfc 2045是mime,虽然http在某些方面与mime相似,但它不是mime,在其他方面也有所不同。特别是它不使用
Content-Transfer-Encoding
. 它确实有用Content-Encoding
意思相似。看到了吗https://tools.ietf.org/html/rfc1945#section-10.3和https://tools.ietf.org/html/rfc1945#appendix-c、 3等。另外,您只使用java终止响应头的行
\n
这就是lf。这些标准要求使用crlf(java)\r\n
)一直如此。有些接受者是宽容的,遵循波斯特尔的格言,但你不应该依赖它。更糟糕的是,你的代码似乎根本没有终止cte行,尽管chrome解析的很好,我猜你只是发布了错误的代码。另外,您不应该在正文后面添加一个不计入内容长度的行终止符,尽管如果您使用的是原始的http/1.0,即没有keepalive,这并不重要,因为在同一个传输连接上不可能有另一个请求和响应。