Пытаюсь вытащить JSON из лямбды, сжать в формат gzip и загрузить в s3. Я могу все это сделать, кроме сжатия в gzip. Я извлек различные фрагменты кода отсюда (SO), первый код, но, похоже, он работает неправильно. Вот то, что я пробовал, и результат:
этот первый метод, кажется, делает файл намного меньше и имеет формат gzip:
public void compressAndUpload(AmazonS3 s3, InputStream in) throws IOException {
Path tmpPath = Files.createTempFile("atest", ".json.gz");
OutputStream out = Files.newOutputStream(tmpPath);
GzipCompressorOutputStream gzOut = new GzipCompressorOutputStream(out);
IOUtils.copy(in, gzOut);
InputStream fileIn = Files.newInputStream(tmpPath);
long size = Files.size(tmpPath);
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("application/x-gzip");
metadata.setContentLength(size);
s3.putObject(bucketName, "atest.json.gz", fileIn, metadata);
}
Однако, когда я перетаскиваю его на свою локальную машину , но когда я пытаюсь использовать на нем 'gunzip', я получаю следующее сообщение об ошибке:
gzip: atest.json.gz: unexpected end of file
этот следующий метод, когда на самом деле не сжимает файл, и когда я вытаскиваю его локально, он говорит «не в gzip format "
public String handleRequest(Input input, Context context) {
try {
byte[] btArr = compress(input.getMessage());
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("application/x-gzip");
metadata.setContentLength(btArr.length);
AmazonS3ClientBuilder.defaultClient().putObject(new PutObjectRequest(bucketName, "test22.json.gz",
new ByteArrayInputStream(btArr), metadata));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static byte[] compress(String str) throws Exception {
if (str == null || str.length() == 0) {
return null;
}
System.out.println("String length : " + str.length());
ByteArrayOutputStream obj=new ByteArrayOutputStream();
GzipCompressorOutputStream gzip = new GzipCompressorOutputStream(obj);
gzip.write(str.getBytes("UTF-8"));
gzip.flush(); <-------******Update: This was missing.. caused it to fail.
gzip.close();
return obj.toByteArray();
}
Я пропустил шаг здесь? Я чувствую, что это должно быть довольно простая вещь ...