2017-08-03 3 views
0

私はファイルを抽出したいと思うzipファイルを持っていますが、私はこのファイルをSpringコントローラ経由で送信することになっています。ZipEntry getEntry()は常にnullを返します

//This code is in a Spring Controller to send the screenshot. 
    ZipFile file = new ZipFile("path/to/zipFile.zip"); 
    try(InputStream is = searchImage(screenshotFileName, file)){ 
     response.setHeader("Cache-Control", "no-store"); 
     response.setHeader("Pragma", "no-cache"); 
     response.setDateHeader("Expires", 0); 
     response.setContentType("image/png"); 
     ServletOutputStream servletOutputStream = response.getOutputStream(); 
     IOUtils.copy(is,servletOutputStream); 
    }catch (IOException e){ 
     response.sendError(HttpServletResponse.SC_NOT_FOUND); 
    } 


private InputStream searchImage(String screenshotFileName, ZipFile file) throws IOException{ 
    ZipEntry entry = file.getEntry(screenshotFileName); 
    if(entry != null){ 
     return file.getInputStream(entry); 
    } 
    return null; 
} 

私はに実行しています問題は、このコードが実行されるたびに、InputStreamgetEntry方法は、スクリーンショットを見つけていないことをnullとして意味を返されていることです。私はzipファイルを見て、スクリーンショットファイルがzipファイルに存在することを知っています。私はこれについて間違っていますか?私が探しているzipファイルには多くのサブディレクトリがありますが、スクリーンショットを見つけるためにそれらを検索する必要はありますか?

+0

名前だけでなく、完全なパスを指定する必要があります。パスは、ファイル内のものと正確に一致する必要があります。 – EJP

答えて

0

FileSystemを使用して、別の方法で1つのファイルをzipファイルから抽出することができました。あなたは今のzip内からファイルはC:\screenshotFileNameに位置されていないため、入力ストリームを簡単に作成することができ、このコード

File outputFile = new File("C:\\" + screenshotFileName); 
Path zipFile = Paths.get("\\path\\to\\Zip.zip"); 
FileSystem fileSystem = FileSystems.newFileSystem(zipFile,null); 
Path source = fileSystem.getPath(screenshotPath); 
Files.copy(source, outputFile.toPath()); 

を使用して1つのファイルを抽出することができます。この問題には、ZipEntryクラスを使用する必要はありません。

関連する問題