【问题标题】:AWS Lambda and S3 - uploaded pdf file is blankAWS Lambda 和 S3 - 上传的 pdf 文件为空白
【发布时间】:2020-06-04 04:59:30
【问题描述】:

我有一个非常简单的函数,它使用 AWS Lambda 和 Amazon 将 PDF 文件上传到 AWS S3 (https://codedestine.com/aws-s3-putobject-java/) API 网关。

我尝试上传包含 2 页文本的 PDF 文件。上传后,PDF 文件(在 AWS S3 上)有 2 个空白页。

这是我在 AWS S3 上上传 PDF 文件的方法。

public static void uploadFile2(MultipartFile mpFile, String fileName) throws IOException{
   
    String dirPath = System.getProperty("java.io.tmpdir", "/tmp");
    File file = new File(dirPath  + "/" + fileName);

    OutputStream ops = new FileOutputStream(file);
    ops.write(mpFile.getBytes());

    s3client.putObject("fakebucketname", fileName, file);

}

为什么上传的PDF文件是空白的?

【问题讨论】:

  • 我不明白你在问什么。您提到了 Lambda 和 API Gateway,但我没有看到与此相关的任何内容。您的链接只是 S3 上传,您的代码似乎试图输出一个文件,然后将该文件放入 S3。
  • 是的。试图将文件放入 s3,如标题中明确说明的那样。文件成功上传到 s3 但它是空白的

标签: java spring amazon-web-services amazon-s3 aws-lambda


【解决方案1】:

您正在使用输出流作为上传请求的输入。只需使用 File,并包含内容类型,例如:

File file = new File(fileName);
PutObjectRequest request = new PutObjectRequest("bucketname", "keyname", file);
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("application/pdf");
request.setMetadata(metadata);
s3Client.putObject(request);

【讨论】:

【解决方案2】:

事实证明,这可以做到这一点。感谢@KunLun 的帮助,这一切都与编码有关。在我的场景中,文件是通过 POST 到 url 传递给 aws 的多部分文件 (pdf)。


            Base64.Encoder enc = Base64.getEncoder();
            byte[] encbytes = enc.encode(file.getBytes());
            for (int i = 0; i < encbytes.length; i++)
            {
                System.out.printf("%c", (char) encbytes[i]);
                if (i != 0 && i % 4 == 0)
                    System.out.print(' ');
            }
            Base64.Decoder dec = Base64.getDecoder();
            byte[] barray2 = dec.decode(encbytes);
            InputStream fis = new ByteArrayInputStream(barray2);
    
            PutObjectResult objectResult = s3client.putObject("xxx", 
            file.getOriginalFilename(), fis, data);


要包含的另一个非常重要的部分是必须正确配置 API 网关设置以支持二进制数据类型。 AWS 控制台 --> API 网关 --> 设置 --> 在所附照片中包含我下面的内容

【讨论】:

    【解决方案3】:

    当您使用 FORM-DATA 从客户端上传文件到服务器端时,服务器会将该文件作为 base64 获取。因此,您必须对其进行解码才能将实际文件上传到您的 aws S3 存储桶。

    使用 nodeJS 的快速参考。

    const decodedFile = Buffer.from(<--add your encode base64 file -->, 'base64'); 
    

    [const decodedFile] 将成为 s3 的 {Body} 参数的值。 您可以对任何编程语言执行相同的概念或逻辑!

    谢谢。

    【讨论】: