You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 10上传Zip文件至Micronaut后端遇文件找不到问题:是否需完整路径及获取方法

问题分析与解决方案

核心结论:你不需要文件的完整路径

前端浏览器出于安全限制,根本不会暴露用户本地文件的完整路径;而且后端也完全不需要这个路径——因为上传的文件内容已经通过Multipart请求的InputStream传递过来了,你直接操作这个流就好,不需要去后端本地文件系统找文件。

你的代码问题所在

看你后端getUncompressedFiles方法里的这行代码:

ZipInputStream zipIn = new ZipInputStream(new FileInputStream(fileName));

这里你用前端传来的文件名(比如File.zip)去后端服务器的本地文件系统里找文件,这显然找不到——因为这个文件是用户从前端上传的,它的内容在请求的输入流里,不是后端本地存在的文件。

修改方案

直接使用前端上传时传递的InputStream来解压,而不是从文件名读取本地文件。修改你的Service层代码如下:

修改后的Service层代码

public void importOrder(String orderId, InputStream in, String fileName) throws IOException {
  // 直接传入前端传来的InputStream
  Set<String> extractedFiles = getUncompressedFiles(in);
  Iterator<String> itr = extractedFiles.iterator();
  while(itr.hasNext()){
    // 你的后续业务逻辑
  }
}

public Set<String> getUncompressedFiles(InputStream zipInputStream) throws IOException {
  Set<String> files = new HashSet<>();
  // 使用传入的InputStream初始化ZipInputStream,不需要本地文件路径
  ZipInputStream zipIn = new ZipInputStream(zipInputStream);
  ZipEntry zipEntry = zipIn.getNextEntry();
  while (zipEntry != null) {
    String zipEntryName = zipEntry.getName();
    String fileName = zipEntryName.substring(zipEntryName.indexOf("order-nr"));
    files.add(fileName);
    zipIn.closeEntry();
    zipEntry = zipIn.getNextEntry();
  }
  zipIn.close();
  return files;
}

前端代码确认

你的Angular前端代码是正确的:

  • 你通过input[type="file"]获取到File对象,然后传递给服务发送请求。
  • 浏览器会自动处理文件的Multipart编码,把文件内容发送给后端,前端无法也不需要获取文件的本地完整路径(这是浏览器的安全策略,防止泄露用户本地文件系统结构)。

额外提示

如果后续你需要把上传的Zip文件保存到后端服务器本地,那你可以用CompletedFileUpload的transferTo(File)方法主动存储,之后再用路径读取;但如果只是解压读取内容,直接用InputStream处理是最高效的,不需要额外存储。

内容的提问来源于stack exchange,提问作者marhg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 17:07:46