通过HTTP发送后,JPEG损坏

时间:2017-06-07 15:47:07

标签: java http

我试图从头开始构建一个简单的HTTP Java服务器。 现在我想让我的浏览器在我的电脑上下载一个.jpg文件, 这就是原因 fo image/jpeg被硬编码到方法中。以下是将HTTP响应打印到我的浏览器的方法。 desiredFile一个名为" Image.jpg"的.jpg文件存储在我的电脑上。

一切都很好,我的兄弟会下载文件,但我无法打开它。 Windows映像程序只是告诉我它可能已损坏"。当我查看图像的详细信息时,我可以看到它具有相同的字节大小,但丢失了诸如分辨率之类的细节。 `

        byte[] bytes = Files.readAllBytes(desiredFile.toPath());

        System.out.println("Attempting to print to client|" + bytes.length

        output.write("HTTP/1.1 200 OK" + "\r\n"
                        + "Content-type: image/jpeg" + "\r\n"
                        + "Content-length: " + bytes.length + "\r\n"
                        + "Content-Disposition: attachment; filename=Imae.jpg" + "\r\n"
                        + "\r\n");

        for (byte currentByte : bytes)
            output.write(currentByte);

        output.flush();
        output.close();

        System.out.println("Printing finished.");
        `

我传输字节的方式有问题吗?将bytes作为整个数组发送不起作用,这就是我发送每个字节的原因。

谢谢!

2 个答案:

答案 0 :(得分:0)

我不是百分百肯定,但你可能会错过标题:

Accept-Ranges: bytes 

答案 1 :(得分:0)

问题是您正在使用OutputWriter

您的字节将被解释为字符,而字符又被编码为不同的字节。例如,对于UTF-8,发送字节0x80将导致两个字节0xC2 0x80。这会破坏图像。

你无法直接发送完整阵列的事实是一个巨大的危险信号:这显然应该有效。如果它没有,你应该找出原因。错误消息可能提到它期望char[]而不是byte[],表明您的源是基于字符的而不是基于字节的。

要解决此问题,请切换到PrintStream。它允许您输出标题的String和正文的byte[]