通过http/1.0发送时,映像作为base64字符串加载?

eblbsuwk  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(326)

我正试图在一个项目中实现http/1.0,该项目的网站加载了我编写的serversocket。它适用于基于字符的文件。但是对于我指定返回base64编码版本的图像文件,即使设置了正确的头文件,例如 content-type: image/png 以及 content-transfer-encoding: base64 rfc 2045。我试着查看chrome网络工具的数据包,它看起来像是把它当作一个文档事件,尽管它是一个图像文件。自从我被困在这个问题上几天以来,我什么都不知道该做!我搜索了所有的stackoverflow,所有的google,我基本上被卡住了。我在一两天前发布了这个问题,当时有人建议在没有运气的情况下使用字节读取器(我也尝试过)。任何视觉输入都是非常有价值的。
我有两种方法是相关的。
第一种是我根据文件是图像还是文本来选择读取文件的方式。

  1. public String readUri(String reqUri) {
  2. returnFile = "";
  3. if (this.fileExists(reqUri)) {
  4. fileType = this.fileType(reqUri); // returns e.g image from image/png
  5. if (fileType.equals("text")) {
  6. // bufferedreader ...
  7. } else if (fileType.equals("image")) {
  8. File imgPath = new File(reqUri);
  9. try {
  10. FileInputStream fileInputStreamReader = new FileInputStream(imgPath);
  11. byte[] bytes = new byte[(int)imgPath.length()];
  12. fileInputStreamReader.read(bytes);
  13. returnFile = Base64.getEncoder().encodeToString(bytes);
  14. fileInputStreamReader.close();
  15. } catch (FileNotFoundException e) {
  16. e.printStackTrace();
  17. } catch (IOException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. }
  22. return returnFile;
  23. }

第二个从上述方法收集数据。这个方法在我的get请求控制器中被调用,并通过serversocket将数据发送回客户机。

  1. StringBuilder response = new StringBuilder();
  2. public String response(
  3. String HTTPVersion, int statusCode, String fileContent, String contentType) {
  4. response.append(
  5. HTTPVersion + " " +
  6. statusCode + " " +
  7. this.getHTTPStatusText(statusCode) + "\n"
  8. );
  9. response.append("Content-transfer-encoding: BASE64");
  10. response.append("Content-Type: " + contentType + "\n");
  11. response.append("content-length: " + fileContent.length() + "\n");
  12. response.append("Date: " + date() + "\n");
  13. response.append("\n");
  14. response.append(fileContent + "\n");
  15. return response.toString();
  16. }

以下是chromes网络工具的请求/响应:

这是当前使用base64编码加载图像的方式:

cczfrluj

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,这并不重要,因为在同一个传输连接上不可能有另一个请求和响应。

相关问题