Сжать JSON в GZIP и загрузить в S3 - PullRequest
0 голосов
/ 02 августа 2020

Пытаюсь вытащить 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();
 }

Я пропустил шаг здесь? Я чувствую, что это должно быть довольно простая вещь ...

...