2016-12-06 1 views
0

Ich muss ein Dienstprogramm erstellen, die eine Reihe von Protokollen sammeln sie zippen und sie an Jira anhängen.Sammeln von ZIP-Logs und Hochladen auf HTTP-Dienst ohne temporäre Datei

Ich plane, httpclient 4.5 zu verwenden. (hat NIO-Unterstützung) Die Jira-API ist hier kein Problem.

Ich möchte Dateien direkt aus dem Dateisystem per Zip-Stream und Upload zu Jira streamen, ohne eine temporäre Zip-Datei im Dateisystem erstellen zu müssen.

Ich fand die Java-API in einem solchen Fall verwirrend und konnte die Verwendung nicht herausfinden. Aufmerksam sieht es so aus, als wäre ein solcher Fall ein guter Kandidat für die Java-NIO-Nutzung (vielleicht ein Kanal?), Konnte aber kein gutes Beispiel finden.

Als Ausgangspunkt habe ich ein Beispiel erstellt, das eine Datei hochlädt, aber ich kann es nicht zum nächsten Schritt des Zip-Streams bringen.

HttpClient httpClient = createHttpClient(); 


final String issueUriAttach = issueUri + "/" + "attachments"; 

HttpPost postRequest = new HttpPost(issueUriAttach); 
final FileInputStream fileInputStream = new FileInputStream("README.md"); 
InputStream in = new InputStream() { 
    @Override 
    public int read() throws IOException { 
     return 0; 
    } 

    @Override 
    public int read(byte[] b, int off, int len) throws IOException { 
     return fileInputStream.read(b,off,len); 
    } 
}; 
InputStreamBody inputStreamBody = new InputStreamBody(in,"README.csv"); 
HttpEntity reqEntity = MultipartEntityBuilder.create() 
     .setContentType(ContentType.MULTIPART_FORM_DATA) 
     .addPart("file", inputStreamBody) 
     .build(); 
postRequest.setHeader(getAuthHeader()); 
postRequest.setHeader(getNocheckHeader()); 

postRequest.setEntity(reqEntity); 
final HttpResponse response = httpClient.execute(postRequest); 

Wie gesagt ich auf Java nicht beschränkt bin I/O Java NIO als auch eine Option ..

+0

können Sie log4j Bibliothek http://stackoverflow.com/questions/3329385/compress-log4j-files – koutuk

+0

Dank @koutuk verwenden. Dies ist ein externes Dienstprogramm. Es sollte Protokolle sammeln, die von der von uns getesteten Anwendung erstellt wurden, und erstellt keine Protokolle. –

Antwort

1

Sie die Daten an ein ZipOutputStream in einem separaten Thread und Rohr zu schreiben, um es zu ein InputStream für den HttpClient zu lesen.

/** 
* Zip a collection of files and pipe the output to an InputStream 
*/ 
public static InputStream zipSource(Collection<Path> paths) throws IOException { 
    // Pipe pair. We zip to the output stream in a separate thread. The data is 
    // then available to be read from the input stream. 
    PipedOutputStream out = new PipedOutputStream(); 
    PipedInputStream in = new PipedInputStream(out); 

    // Zip the file to the input stream in another thread 
    zipExecutor.execute(() -> { 
     try { 
      zip(paths, out); 
     } catch (IOException e) { 
      System.err.println("Zip failed " + e); 
     } 
    }); 

    return in; 
} 

/** 
* Zip a collection of files to an output stream 
*/ 
public static void zip(Collection<Path> paths, OutputStream out) throws IOException { 
    try (ZipOutputStream zout = new ZipOutputStream(out)) { 
     for (Path path : paths) { 
      zout.putNextEntry(new ZipEntry(path.getFileName().toString())); 
      Files.copy(path, zout); 
      zout.closeEntry(); 
     } 
    } 
} 

private static final Executor zipExecutor = Executors.newCachedThreadPool(r -> { 
    Thread t = new Thread(r, "zip task"); 
    t.setDaemon(true); 
    return t; 
}); 
+0

sieht interessant aus, ich werde es versuchen. Obwohl es wie eine Datei pro Upload aussieht. –

+0

Ich habe die beiden Bedenken in dem Beispiel aufgeteilt. Eine Methode behandelt die ZIP-Datei und die andere die Ausgabe über einen 'InputStream'. – teppic

+0

funktioniert wie Magie danke! –

Verwandte Themen