2012-06-13 2 views
2

나는 서버에 내 우편 압축 파일을 업로드하고 거기에 .txt.jpg 파일을 열려면. 내 컨트롤러에서 내 보관 파일을 성공적으로 가져 와서 ZipEntry을 통해 각 파일의 이름을 가져옵니다. 이제 열어보고 싶지만 내 파일에 대한 전체 경로를 가져와야합니다.봄 : 업로드 된 zip 파일을 구문 분석하는 방법은 무엇입니까?

내가 그렇게 할 수있는 방법을 발견하지 않았습니다. 어떻게 할 수있는 방법을 제안 해 주시겠습니까?

업데이트

내가 예를 사용하려고은 아래에 제시되었다하지만 난 FileNotFoundException

그래서 내가으로 돌아가 내가 가지고

ZipFile zFile = new ZipFile("trainingDefaultApp.zip"); 

파일을 열 수 없습니다입니다 내 시작점. Java Spring 애플리케이션에 업로드 양식이 있습니다. 컨트롤러에서 나는 그럼 각 ZipEntry

InputStream is = new ByteArrayInputStream(zip); 
    ZipInputStream zis = new ZipInputStream(is); 

    ZipEntry entry = null; 
    while ((entry = zis.getNextEntry()) != null) { 
     String entryName = entry.getName(); 
     if (entryName.equals("readme.txt")) { 
      ZipFile zip = new ZipFile(entry.getName()); // here I had got an exception 

이 문서에 따르면 내가 좋아했지만 나에게로 파일 이름 만 전달하는 이상한 도착했다 byte[]

@RequestMapping(method = RequestMethod.POST) 
public String create(UploadItem uploadItem, BindingResult bindingResult){ 
    try { 
     byte[] zip = uploadItem.getFileData().getBytes(); 
     saveFile(zip); 

같은 우편 아카이브를 가지고 있었다 당신이 성공적으로 특정 항목에 대해 당신에게 InputStream를 돌려주는 것 파일

+0

무엇을 의미합니까? 성공적으로 열었다 고하셨습니까? 당신은 무엇에 "완전한 길"을 가지고 있지 않습니까? –

+0

내 zip 아카이브가 들어있는 CommonsMultipartFile을 byte []로 열었습니다. 나는 그것을 ZipInputStream으로 변환하고 루프 내 아카이브에있는 각 파일에 대해 ZipEntry를 얻었습니다. 이제이 .txt 파일과 .jpg 파일을 읽고 싶지만 ZipEntry에는이 파일의 이름 만 포함되어 있습니다. 그래서이 파일에 대한 전체 경로가 없으므로 새로운 파일 ("d : /some.txt")로 열 수 없습니다. –

답변

0

내 uissue를 해결. 이 솔루션은 ZipInputStream에서 직접 작동합니다. 여기에 코드 :

private void saveFile(byte[] zip, String name, String description) throws IOException { 
    InputStream is = new ByteArrayInputStream(zip); 
    ZipInputStream zis = new ZipInputStream(is); 

    Application app = new Application(); 
    ZipEntry entry = null; 
    while ((entry = zis.getNextEntry()) != null) { 
     String entryName = entry.getName(); 
     if (entryName.equals("readme.txt")) { 
      new Scanner(zis); //!!! 
      //... 
      zis.closeEntry(); 
1

zipFile.getInputStream(ZipEntry entry)을 열 것이라고 생각한다.

ZipFile.getInputStream() - http://docs.oracle.com/javase/6/docs/api/java/util/zip/ZipFile.html#getInputStream(java.util.zip.ZipEntry)에 대해 javadocs을 확인하십시오.

업데이트 :

나는 당신의 질문을 오해. ZipInputStream을 사용하는 경우 Oracle 웹 사이트 (http://java.sun.com/developer/technicalArticles/Programming/compression/)에 스트림에서 읽는 방법을 보여주는 샘플 코드가 있습니다. 첫 번째 코드 샘플을 참조하십시오. 코드

  • 샘플 1 : UnZip.java.

복사 여기,이 항목에서 읽고 및 파일에 직접 작성,하지만 당신은 어떤 논리를 당신이 필요로하는 것을 대체 할 수있다 :

ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); 
ZipEntry entry; 
while((entry = zis.getNextEntry()) != null) { 
    System.out.println("Extracting: " +entry); 
    int count; 
    byte data[] = new byte[BUFFER]; 
    // write the files to the disk 
    FileOutputStream fos = new FileOutputStream(entry.getName()); 
    dest = new 
    BufferedOutputStream(fos, BUFFER); 

    while ((count = zis.read(data, 0, BUFFER)) != -1) { 
     dest.write(data, 0, count); 
    } 
} 
+0

ZipFile이 아니라 ZipInputStream이 있다는 것을 알았습니다. Oracle 웹 사이트 (http://java.sun.com/developer/technicalArticles/Programming/compression/)에는 스트림에서 읽는 방법을 보여주는 샘플 코드가 있습니다.첫 번째 코드 샘플 : 코드 샘플 1 : UnZip.java를 참조하십시오. –

+0

음 ... ZipFile을 어떻게 사용할 수 있습니까? 생성자에서는이 파일의 전체 경로가 없으면 만들 수없는 파일을 전달해야합니다. 필자가 File의 이름을 String으로 전달한 경우 FileNotFoundException이 발생했습니다. –

+0

이 예제를 시도합니다. 나는 동일한 excaeption 있습니다. 그 파일을 찾을 수 없다. 테스트를 위해 필자의 아카이브 "tetx.zip"의 이름을 하드 코드했지만 새로운 FileInputStream ("tetx.zip")을 만들려고 할 때 실패했습니다. 잘못되었거나 다른 곳에서 문제가 있습니까? –