【问题标题】:Can InputStreamResource be used instead of temporary file for async file upload to sftp server是否可以使用 InputStreamResource 代替临时文件将异步文件上传到 sftp 服务器
【发布时间】:2021-03-01 10:36:48
【问题描述】:

我有一个Spring Integration flow,它将文件异步上传到 sftp 服务器,要上传的文件来自 http 端点。最初我遇到了与here 讨论过的同样的问题,很高兴它得到了解决。

在同一个 SO 线程中我发现了这条评论。

在企业环境中,您通常会拥有无法承受这样大小的文件缓冲到内存中。可悲的是, InputStreamResource 也不起作用。到目前为止,您最好的选择是将内容复制到自己的临时文件(例如 File#createTempFile)中,您可以在处理线程结束时对其进行清理。

目前我正在将文件输入流连接到InputStreamResource 以解决这个问题,它可以完美地工作。为什么评论者说 InputStreamResource 也不起作用,AFAIK InputStream 从不将数据存储在内存中

文件上传后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();
   }
}

【问题讨论】:

    标签: spring-mvc spring-integration


    【解决方案1】:

    2-5 Mb 可能不需要担心大小。当文件大小为1-2Gb 时,可能会出现此问题。虽然当您的服务发生多个并发上传时,您可能会遇到一些内存不足的情况。

    InputStreamResource 只是一个围绕InputStream 的装饰器,带有Resource API,用于访问底层委托流。由于MultipartFile 在 HTTP 上传请求结束时被删除,因此尚不清楚它如何在异步环境中工作。

    另外,您没有显示任何代码来更好地了解情况......

    【讨论】:

    • 假设如果同时发生 200 个并发上传,这是否也意味着将使用 fileSize multiplied by 200 内存?顺便说一句,我在我的问题中添加了代码示例。谢谢
    • 看起来你的messagingGateway.upload() 不是一个异步调用......所以,这可能就是你的InputStreamResource 解决方案有效的原因。否则我相信它会失败,因为 HTTP 层在请求结束后重新获得控制权后删除 tmp 文件......
    • 你是对的。谢谢,我刚刚意识到我的异步方法不起作用所以InputStreamResource 起作用了,但是我将应用 tmp 文件机制
    • 好。是时候考虑一​​下了:stackoverflow.com/help/someone-answers?
    猜你喜欢
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多