我有一个文件,我试图从一台服务器发送到另一台服务器。由于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资源管理器中打开它,我被告知它无效,即使它在另一端工作得很好。发生了什么事?
答案 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。 希望对您有所帮助。