2017-09-13 1 views
0

Das Projekt ermöglicht dem Benutzer, eine Datei herunterzuladen, die die heruntergeladene Datei wird die gezippte Datei sein. Die heruntergeladene gezippte Datei funktioniert gut, außer dass der leere Ordner nicht im gezippten Ordner enthalten ist. Einer der Entwickler implementiert mit dem unten stehenden Code mit seinem MacBook, der keinen Fehler auslöst. Wenn der Quellcode in Ubuntu-Computer ausgeführt wird, tritt jedoch Fehler auf.Konnte keinen leeren Ordner mit Java in Ubuntu zippen

Der Code:

def zipFolder(folderNamePath: String, subDirectory: String,zip: ZipOutputStream): Unit = { 

    val file = new File(folderNamePath) 
    val readBuffer = new Array[Byte](Buffer) 
    val fileList = file.list() 

    var i = 0 
    for(i <- 0 until fileList.length){ 
     val path = folderNamePath + "/" + fileList(i) 
     val currFile = new File(path) 
     if(currFile.isDirectory){ 
     val filePath = currFile.getPath 
     zipFolder(filePath, subDirectory + '/' + fileList(i) ,zip) 

     }else{ 
     val anEntry = new ZipEntry(subDirectory + '/' + fileList(i)) 
     val bis = new BufferedInputStream(new FileInputStream(path), Buffer) 
     zip.putNextEntry(anEntry) 
     var bytesIn: Int = -1 
     while({ 
      bytesIn = bis.read(readBuffer, 0, Buffer) 
      bytesIn != -1 
     }){ 
      zip.write(readBuffer, 0, bytesIn); 
     } 

     bis.close() 
     } 
    } 

    //THE CODE BELOW IS TO ZIP EMPTY DIRECTORY 
    if(fileList.length == 0){ 
     val path = folderNamePath 
     val anEntry = new ZipEntry(subDirectory) 
     val bis = new BufferedInputStream(new FileInputStream(path + "/"), Buffer) 
     zip.putNextEntry(anEntry) 

     bis.close() 
    } 

    } 

Und der Fehler protokolliert:

! @75akh0a6a - Internal server error, for (POST) 
[/storage_ws/download_directory_file] -> 

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution 
exception[[FileNotFoundException: /home/jarvis/project/storage-api/media/jarvis/test/Test/Testing (Is a directory)]] 
at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:280) 
at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:206) 
at play.api.GlobalSettings$class.onError(GlobalSettings.scala:160) 
at play.api.DefaultGlobal$.onError(GlobalSettings.scala:188) 
at play.api.http.GlobalSettingsHttpErrorHandler.onServerError(HttpErrorHandler.scala:98) 
at play.filters.cors.AbstractCORSPolicy$$anonfun$2.applyOrElse(AbstractCORSPolicy.scala:146) 
at play.filters.cors.AbstractCORSPolicy$$anonfun$2.applyOrElse(AbstractCORSPolicy.scala:145) 
at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:346) 
at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:345) 
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) 
Caused by: java.io.FileNotFoundException: /home/jarvis/project/storage-api/media/user/jarvis/Test/Testing (Is a directory) 
at java.io.FileInputStream.open0(Native Method) 
at java.io.FileInputStream.open(FileInputStream.java:195) 
at java.io.FileInputStream.<init>(FileInputStream.java:138) 
at java.io.FileInputStream.<init>(FileInputStream.java:93) 
at tools.ZipUtils$.zipFolder(ZipUtils.scala:122) 
at tools.ZipUtils$$anonfun$zipFolder$1.apply$mcVI$sp(ZipUtils.scala:101) 
at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:160) 
at tools.ZipUtils$.zipFolder(ZipUtils.scala:96) 
at tools.IO$.handleDownloadDirectoryFile(IO.scala:176) 
at controllers.FileHandleController$$anonfun$downloadDirectoryFile$1$$anonfun$apply$50.apply(FileHandleController.scala:586) 

Der Code ausgeführt und ohne folgenden Fall if(fileList.length == 0){ für leere Ordner zippen, die das ZIP-Ordner den leeren Ordner ausschließen.

+0

Try FilenameUtils Klasse von Apache Commons IO zu verwenden (https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org /apache/commons/io/FilenameUtils.html) oder die Paths-Klasse von java.nio (https://docs.oracle.com/javase/7/docs/api/java/nio/file/Paths.html). Es gibt viele nützliche Methoden. Hat mir immer geholfen, wenn Probleme mit plattformübergreifenden Entwicklungen auftraten. Viel Glück – Bohdan

Antwort

1

Das Problem tritt auf, weil Sie versuchen, einen FileInputStream für ein Verzeichnis anstelle einer Datei zu öffnen.

Tatsächlich sehen Sie die Ausnahmemeldung hier:

Caused by: java.io.FileNotFoundException: /home/jarvis/project/storage-api/media/user/jarvis/Test/Testing (Is a directory) 
at java.io.FileInputStream.open0(Native Method) 

Hier können Sie mit einer leicht modifizierten Version der Methode sind, die das Problem lösen sollte. Bitte beachten Sie, dass ich stattdessen alle '/' Vorkommen mit File.separator ersetzt habe.

def zipFolder(folderNamePath: String, subDirectory: String,zip: ZipOutputStream): Unit = { 

    val file = new File(folderNamePath) 
    val readBuffer = new Array[Byte](Buffer) 
    val fileList = file.list() 

    var i = 0 
    for(i <- 0 until fileList.length){ 
     val currFile = new File(folderNamePath, fileList(i)) 
     if(currFile.isDirectory){ 
     val filePath = currFile.getPath 
     zipFolder(filePath, subDirectory + File.separator + fileList(i) ,zip) 

     }else{ 
     val path = folderNamePath + File.separator + fileList(i) 
     val anEntry = new ZipEntry(subDirectory + File.separator + fileList(i)) 
     val bis = new BufferedInputStream(new FileInputStream(path), Buffer) 
     zip.putNextEntry(anEntry) 
     var bytesIn: Int = -1 
     while({ 
      bytesIn = bis.read(readBuffer, 0, Buffer) 
      bytesIn != -1 
     }){ 
      zip.write(readBuffer, 0, bytesIn); 
     } 

     bis.close() 
     } 
    } 

    //THE CODE BELOW IS TO ZIP EMPTY DIRECTORY 
    if(fileList.length == 0){ 
     zip.putNextEntry(new ZipEntry(subDirectory + File.separator)) 
     zip.closeEntry() 
    } 
} 

Der leere Ordner ist nur sichtbar, wenn die gezippte Datei extrahiert wird. Zumindest für Ubuntu Standard-Zip-Tool (Archiv verwalten)

+0

Der obige Code funktioniert! Es gibt jedoch einen Fehler, der den leeren Ordner zu einer unbekannten Datei macht. Irgendeine Idee? –

+0

Ich habe "/" in zip.putNextEntry (neuer ZipEntry (subDirectory + "/")) hinzugefügt. Der leere Ordner ist wieder verschwunden –

+0

Froh, das zu hören :) – P3trur0

Verwandte Themen