问题
I have an Spring App(running on AWS Lambda) which gets a file and uploads it on AWS S3.
The Spring Controller sends a MultipartFile
to my method, where it's uploaded to AWS S3, using Amazon API Gateway.
public static void uploadFile(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);
}
I try to upload a PDF file which has 2 pages with text. After upload, the PDF file(on AWS S3) has 2 blank pages.
Why is the uploaded PDF file blank?
I also tried with other files(like PNG image) and when I open it the image I uploaded is corrupted.
The only thing that worked was when I uploaded a text file.
回答1:
Can I say I have seen people do this allot, whereby their app, accepts a MultipartFile, and proxy upload it to S3.
Uploading to your App and then S3 honestly is the wrong approach, and has many drawbacks which negate the benefits of using S3 in the first place. Simply generate a pre-signed URL and have your user upload directly to S3. This is preferable for a few reasons but the main ones are:
- An app which acepts MultipartFile upload can be easily DDOS'ed if not careful, this happened to our app when somebody uploaded many files at the same time whole system went down.
- It will be MUCH slower to upload to your backend app and then upload to S3.
If you happened to be using Cognito you can also achieve this with 0 backend code using AWS Amplify. Which I highly recommend, but if not then pre-signed URL is the way to go.
来源:https://stackoverflow.com/questions/60328325/aws-lambda-and-s3-uploaded-pdf-file-is-blank-corrupt