Извлеките содержимое Zip-файла, загруженного с помощью запроса HTTP GET
Я должен загрузить Zip-файл из вызова rest и извлечь его содержимое (некоторые PDF-файлы и файл PNG).
Я использую Java Spring.
Как это сделать?
2 ответа:
Вы можете использовать RestTemplate Spring для загрузки файла
RestTemplate templ = new RestTemplate(); byte[] downloadedBytes = templ.getForObject(url, byte[].class);
Извлеките содержимое с помощью стандартной java или сторонней библиотеки.
Пример утилиты, адаптированной отсюда: http://www.codejava.net/java-se/file-io/programmatically-extract-a-zip-file-using-java
package com.test; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class ZipHelper { private static final int BUFFER_SIZE = 4096; public static void unzip(byte[] data, String dirName) throws IOException { File destDir = new File(dirName); if (!destDir.exists()) { destDir.mkdir(); } ZipInputStream zipIn = new ZipInputStream(new ByteArrayInputStream(data)); ZipEntry entry = zipIn.getNextEntry(); while (entry != null) { String filePath = dirName + File.separator + entry.getName(); if (!entry.isDirectory()) { // if the entry is a file, extracts it extractFile(zipIn, filePath); } else { // if the entry is a directory, make the directory File dir = new File(filePath); dir.mkdir(); } zipIn.closeEntry(); entry = zipIn.getNextEntry(); } zipIn.close(); } private static void extractFile(ZipInputStream zipIn, String filePath) throws IOException { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath)); byte[] bytesIn = new byte[BUFFER_SIZE]; int read = 0; while ((read = zipIn.read(bytesIn)) != -1) { bos.write(bytesIn, 0, read); } bos.close(); } }
Затем вы используете эту утилиту следующим образом:
ZipHelper.unzip(downloadedBytes, "/path/to/directory");
Тело requesdt должно быть таким:
@RequestMapping(value = "/push/{id}", method = RequestMethod.POST, consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE, produces=MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.OK) public String pushTransactions(@PathVariable("id") String id, @RequestBody byte[] str) throws MessagingException, JsonParseException, JsonMappingException, IOException {
И в контроллере, вы можете сделать это:
GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(str)); ByteArrayOutputStream out = new ByteArrayOutputStream(); int len; while ((len = gis.read(buffer)) > 0) { out.write(buffer, 0, len); } gis.close(); out.close();