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

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

我正试图在一个项目中实现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编码加载图像的方式:

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

相关问题