2016-07-29 40 views
0

Ich habe einen REST-Service mit RESTEasy 3.0.12 entwickelt, der auf WildFly 9 bereitgestellt wird, um eine Datei in das lokale Dateisystem hochzuladen. Ich habe versucht, eine ZIP-Datei (Testen mit POST MAN sendende Datei als Binärdatei nicht mehrteilig) hochladen Ich konnte CSV, TXT, Dateiformat erfolgreich hochladen, aber wenn ich versuche, eine ZIP-Datei zu senden, speichert es korrekt im lokalen Dateisystem aber wenn ich versuche zu entpacken sagtHochladen einer .zip-Datei als binärer InputStream vom REST-Service

  • Header Fehler
  • Unconfirmed Beginn des Archivs
  • Warnungen: Header Fehler
  • es gibt einige Daten nach dem Ende der Nutzdaten

Code:

@Path("/uploadZip") 
@POST 
@Produces(MediaType.APPLICATION_JSON) 
public Response uploadZip(@Context HttpServletRequest req, InputStream payload){ 

    // save to filesystem local. 

    Writer wr = null; 
    String tempFileName = System.getProperty("java.io.tmpdir"); 
     try { 
      wr = new BufferedWriter(new FileWriter(tempFileName)); 
      IOUtils.copy(payload, wr, "UTF-8"); 
     } catch (IOException e) { 
      return errorResponse; 
     } finally { 
      // closing writer and stream 
      IOUtils.closeQuietly(wr); 
      IOUtils.closeQuietly(payload); 
     } 

     ... 
} 

Wer weiß, wie man eine gute Zip-Datei speichern?

Antwort

1

*** Allgemeine Informationen über Ihre Fehler Headers:

Zip-Dateien enthalten lokale Header und ein zentrales Verzeichnis am Ende der Datei. Ich kenne die grausigen Details nicht - und ich werde nicht versuchen, sie zu erweitern, aber wenn Sie einen Header-Fehler bekommen, dann ist Ihre Zip-Datei beschädigt. Ich bin mir nicht sicher, was Sie meinen, da sind einige Daten nach den "Nutzdaten".

*** Gedanken zu Ihrem Code: Lassen Sie uns konzeptionell denken.

Ihr Endpunkt erfasst ein InputStream-Objekt, das die Oberklasse aller InputStream-Objekte darstellt, die einen Eingabestream von Bytes darstellen. Ihre Datei ist im Wesentlichen in ein Objekt eingebettet, das Sie byte-for-byte lesen können. Das erste Problem, das ich sehe, ist, dass Sie einen Writer deklarieren, um diese Bytes aus dem InputStream zu schreiben. Remember - Leser und Writer sind zum Schreiben Zeichenströme, Eingabe- und Ausgabeströme sind für Byteströme. Dies erklärt, warum Ihre CSV- und TXT-Dateien erfolgreich sind. Es ist wichtig, diesen Unterschied zu kennen und sich daran zu erinnern!

@Path("/uploadZip") 
@POST 
@Produces(MediaType.APPLICATION_JSON) 
public Response uploadZip(@Context HttpServletRequest req, InputStream payload){ 

OutputStream fos = new FileOutputStream(new File("path/to/filename.zip"); 

    try { 
     byte[] bufferSize = new byte[1024]; 
     int i = 0; 
     while ((i = payload.read(bufferSize)) != -1) { 
      fos.write(buf, 0, i); 
     } 
    } catch (IOException e) { 
     return errorResponse; 
    } finally { 
     fos.close(); 
    } 
    ... 
} 

Ich bin zuversichtlich, dass es funktioniert. Lass es mich wissen, wenn dir das Probleme bereitet. Viel Glück!

+1

das funktioniert wie ein sharm! Danke, Mann! – DarkAngeL