我有一个< code > Spring Integration flow 异步上传文件到sftp服务器,上传的文件来自httpendpoint。最初,我面临着与这里讨论的相同的问题,很高兴它得到了解决。
在同一个SO帖子里,我发现了这个评论。
在企业环境中,通常会有大小不足以缓冲到内存中的文件。遗憾的是,InputStreamResource也无法工作。据我所知,最好的办法是将内容复制到自己的临时文件(例如,file#createTempFile),您可以在处理线程结束时清理该文件。
目前我正在将文件inputstream连接到< code>InputStreamResource来解决这个问题,它工作得非常完美。为什么评论者说InputStreamResource也不行,AFAIK InputStream
从不在内存中存储数据
文件上载后,< code>InputStreamResource的inputStream会自动关闭吗?
当我们说大文件时,我们这里指的是文件大小。目前在我的情况下,2-5 Mb的文件被上传到SFTP
我真的需要考虑将文件上传机制更改为类似于存储在临时文件夹中的机制吗?
代码示例:
@PostMapping("/upload")
public void sampleEndpoint(@NotEmpty @RequestParam MultipartFile file )
throws IOException {
Resource resource = new InputStreamResource(file.getInputStream());
sftpFileService.upload(resource);
}
SftpFileService异步上载方法:
@Async
public void upload(Resource resource){
try{
messagingGateway.upload(resource);
}catch(Exception e){
e.printStackTrace();
}
}
2-5 Mb
可能不是需要担心的大小。当文件的大小为 1-2Gb
时,可能会出现此问题。尽管当您的服务发生多个并发上传时,您可能会面临一些内存不足的问题。
< code>InputStreamResource只是一个围绕< code>InputStream的装饰器,具有< code>Resource API,用于访问底层委托流。不清楚它如何在异步环境中工作,因为< code>MultipartFile在HTTP上传请求结束时被删除。
另外,您不会显示任何代码来更好地了解情况......