首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以从Spring Boot Controller返回S3Object吗?

可以从Spring Boot Controller返回S3Object吗?
EN

Stack Overflow用户
提问于 2017-10-20 06:22:40
回答 1查看 854关注 0票数 0

我对REST特别是Spring Boot很不熟悉。我正在编写一个微服务,它被请求S3文件,并且必须以某种方式返回它们。文件将太大(2GB+),无法保存在微服务内存中,然后将其发送回调用者,因此我认为可以简单地返回一个序列化的S3Object,然后我的客户机可以通过重复调用S3ObjectInputStream.read(bytes[]),以块的形式流式传输文件内容。

我很难做到这一点,由于我的知识有限,我甚至不知道这是不是可能的,或者我是否在想wright。

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

返回主体为SerializationUtils.serialize(S3Object)的ResponseEntity也失败。即使S3Object实现了Serializable接口,每次产生的byte[]的长度都是1000,并且当我反序列化时,我无法获得对象内容,因为S3Object.getObjectContent()总是返回null。

我能做什么?

EN

回答 1

Stack Overflow用户

发布于 2017-10-20 06:54:36

我不认为这是必要的。下面是一个使用RESTful接口返回请求文件的示例:

代码语言:javascript
复制
@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添加到您希望从该端点下载的"produces“属性,或者为每个媒体类型添加另一个类似的端点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46839756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档