2016-12-06 1 views
0

Мне нужно создать утилиту, которая собирает набор журналов, zip их и прикреплять их к jira.Сбор журналов ZIP и загрузка в службу Http без временного файла

Я планирую использовать httpclient 4.5. (имеет поддержку NIO) API jira здесь не проблема.

Я хотел бы передавать файлы непосредственно из файловой системы через zip-поток и загружать в jira без необходимости создания временного zip-файла в файловой системе.

Я обнаружил, что API-интерфейс java запутан в таком случае и не смог определить использование. Внимательно выглядит, что такой случай является хорошим кандидатом на использование NIO в Java (может быть, канал?), Но не нашел хорошего примера.

В качестве отправной точки я создал пример, который загружает один файл, но я не могу его перенести на следующий шаг Zip-потока.

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); 

Как я сказал, что я не ограничивается Java I/O Java NIO вариант, а ..

+0

вы можете использовать log4j библиотеку http://stackoverflow.com/questions/3329385/compress-log4j-files – koutuk

+0

Благодаря @koutuk. Это внешняя утилита. Он должен собирать журналы, создаваемые приложением, которое мы тестируем, и не создаем журналы. –

ответ

1

Вы должны записать данные в ZipOutputStream в отдельном потоке и через канал, InputStream для HttpClient для чтения.

/** 
* 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

выглядит интересно, я попробую. Хотя он выглядит как один файл для каждой загрузки. –

+0

Я разделил две проблемы в этом примере. Один из методов обрабатывает zip, а другой предоставляет выход через 'InputStream'. – teppic

+0

работает как волшебное спасибо! –

Смежные вопросы