可以从Spring Boot Controller返回一个S3Object吗?

时间:2017-10-19 22:22:40

标签: java spring spring-boot serialization amazon-s3

我非常喜欢使用REST API和Spring Boot。我正在编写一个微服务,要求提供S3文件,并且必须以某种方式返回它们。文件将太大(2GB +)以保留在微服务内存中,然后将其发送回调用者,所以我想我可以简单地返回一个序列化的S3Object,我的客户端可以通过重复调用来流式传输文件内容。 S3ObjectInputStream.read(字节[])。

我很难让这成为可能,而且由于我的知识有限,如果可能或者我正在考虑怀疑,我甚至都不会这样做。

我尝试过返回ResponseEntity。使用Postman一切都很酷,并且使用jackson库正确序列化S3Object,但客户端的deseralization崩溃,因为方法S3Object.setObjectContent被重载并且多个setter冲突。

使用SerializationUtils.serialize(S3Object)返回ResponseEntity,因为正文也失败了。甚至S3Object实现Serializable接口,每次,byte []得到的长度为1000,当我反序列化时,我无法获取对象内容,因为S3Object.getObjectContent()总是返回null。

我该怎么办?

1 个答案:

答案 0 :(得分:0)

不需要,我不认为。以下是如何使用RESTful api返回所请求文件的示例:

@RequestMapping(
    value = "/downloads/{fileName}",
    method = {RequestMethod.GET, RequestMethod.OPTIONS},
    produces = {MediaType.APPLICATION_OCTET_STREAM_VALUE})
@ResponseStatus(value = HttpStatus.OK)
public void downloadPolicyDocument( 
    @PathVariable("fileName") String fileName, 
    HttpServletResponse response) throws IOException {

    response.setCharacterEncoding("UTF-8");
    response.addHeader("Access-Control-Allow-Headers", "Range");
    response.addHeader("Access-Control-Expose-Headers", "Accept-Ranges, Content-Encoding, Content-Length, Content-Range");
    response.setHeader("Content-Disposition", "attachment; filename=\"" + id + "\"");

    try (InputStream inputStream = yourMethodThatGetsTheFileAsBufferedInputStream(fileName)) {

        ReadableByteChannel inputChannel = Channels.newChannel(inputStream);
        WritableByteChannel outputChannel = Channels.newChannel(response.getOutputStream());
        response.setContentLength(fastChannelCopy(inputChannel, outputChannel));
    }
    catch (IOException e) {
        throw new YourCustom404Exception(e.getMessage(), e);
    }
}

将其他MediaType添加到您希望从此端点下载的“produce”属性中,或者为每个mediatype添加另一个类似的端点。