通过Spring RestTemplate发送PUT请求时文件被破坏

时间:2015-06-17 21:24:53

标签: java spring rest

我有一个文件,我试图从一台服务器发送到另一台服务器。由于File对象表示文件系统上的特定位置,并且当我发送该文件时新文件上不存在该文件,因此我必须通过其他方式进行传输。

我认为发送它的最佳方式是一个简单的字节数组,就像这样(使用Apache Commons FileUtils):

File file = <...>;
byte[] fileByteArray = FileUtils.readFileToByteArray(file);
restTemplate.put("http://example.com/upload/", fileByteArray);

然后我在另一端接收文件,如下:

@RequestMapping(value = "upload/", method = RequestMethod.PUT)
public void upload(
        @NotNull @RequestBody byte[] data
) {
    File file = <...>;
    FileUtils.writeByteArrayToFile(file, data);
}

但是,另一端的文件已损坏。例如,如果我发送一个zip文件并尝试在Windows资源管理器中打开它,我被告知它无效,即使它在另一端工作得很好。发生了什么事?

2 个答案:

答案 0 :(得分:0)

问题在于将文件作为byte[]发送。 Spring将其转换为String,然后将String转换为byte[](相当于String.getBytes())。这会产生与您开始时略有不同的byte[],这会导致损坏。

相反,您应该发送InputStream,或者如果您必须通过byte[]发送,请将其发送到包装对象中。

答案 1 :(得分:0)

像通过@ byte[]POST发送PUT时提到的@Thunderforge一样,Spring将其转换为String并返回。因此,我在发送byte []之前先对其进行编码:

byte[] bytesEncoded = Base64.getEncoder().encode(fileByteArray);

然后将其解码回去:

byte[] bytesEncoded = Base64.getDecoder().decode(bytesEncoded);

这对我有用,谢谢@Thunderforge。 希望对您有所帮助。