我对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。
我能做什么?
发布于 2017-10-20 06:54:36
我不认为这是必要的。下面是一个使用RESTful接口返回请求文件的示例:
@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“属性,或者为每个媒体类型添加另一个类似的端点。
https://stackoverflow.com/questions/46839756
复制相似问题