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
相关产品推荐
相关产品推荐

