如何通过Spring-Feign获取InputStream?
How to get InputStream via Spring-Feign?
我想通过 Spring-OpenFeign 零拷贝从服务器下载文件并将其保存在本地目录中。
简单的下载方法如下:
import org.apache.commons.io.FileUtils
@GetMapping("/api/v1/files")
ResponseEntity<byte[]> getFile(@RequestParam(value = "key") String key) {
ResponseEntity<byte[]> resp = getFile("filename.txt")
File fs = new File("/opt/test")
FileUtils.write(file, resp.getBody())
}
在这段代码中,数据流是这样的feign Internal Stream -> Buffer -> ByteArray -> Buffer -> File
我如何才能更高效、更快速地下载和保存文件?
长话短说;博士。使用 ResponseEntity<InputStreamResource>
和 Java NIO
根据 SpringDecoder,Spring 使用 HttpMessageConverters 解码响应
ResourceHttpMessageConverter 是 HttpMesageConverters return InputStreamResource 之一,其中包含从 Content-Disposition
派生的 InputStream 和文件名。
但是,必须初始化 ResourceHttpMessageConverter supportsReadStreaming = true (default value)
如果您对此实现有更多兴趣,check this code.
所以,修改后的代码如下:
@GetMapping("/api/v1/files")
ResponseEntity<InputStreamResource> getFile(@RequestParam(value = "key") String key)
JDK9
try (OutputStream os = new FileOutputStream("filename.txt")) {
responeEntity.getBody().getInputStream().transferTo(os);
}
JDK8以下
使用 Guava ByteStreams.copy()
Path p = Paths.get(responseEntity.getFilename())
ReadableByteChannel rbc = Channels.newChannel(responeEntity.getBody().getInputStream())
try(FileChannel fc = FileChannel.open(p, StandardOpenOption.WRITE)) {
ByteStreams.copy(rbc, fc)
}
现在,Feign Internal Stream -> File
我想通过 Spring-OpenFeign 零拷贝从服务器下载文件并将其保存在本地目录中。
简单的下载方法如下:
import org.apache.commons.io.FileUtils
@GetMapping("/api/v1/files")
ResponseEntity<byte[]> getFile(@RequestParam(value = "key") String key) {
ResponseEntity<byte[]> resp = getFile("filename.txt")
File fs = new File("/opt/test")
FileUtils.write(file, resp.getBody())
}
在这段代码中,数据流是这样的feign Internal Stream -> Buffer -> ByteArray -> Buffer -> File
我如何才能更高效、更快速地下载和保存文件?
长话短说;博士。使用 ResponseEntity<InputStreamResource>
和 Java NIO
根据 SpringDecoder,Spring 使用 HttpMessageConverters 解码响应
ResourceHttpMessageConverter 是 HttpMesageConverters return InputStreamResource 之一,其中包含从 Content-Disposition
派生的 InputStream 和文件名。
但是,必须初始化 ResourceHttpMessageConverter supportsReadStreaming = true (default value)
如果您对此实现有更多兴趣,check this code.
所以,修改后的代码如下:
@GetMapping("/api/v1/files")
ResponseEntity<InputStreamResource> getFile(@RequestParam(value = "key") String key)
JDK9
try (OutputStream os = new FileOutputStream("filename.txt")) {
responeEntity.getBody().getInputStream().transferTo(os);
}
JDK8以下
使用 Guava ByteStreams.copy()
Path p = Paths.get(responseEntity.getFilename())
ReadableByteChannel rbc = Channels.newChannel(responeEntity.getBody().getInputStream())
try(FileChannel fc = FileChannel.open(p, StandardOpenOption.WRITE)) {
ByteStreams.copy(rbc, fc)
}
现在,Feign Internal Stream -> File