Ich habe eine Frühlings App (läuft auf AWS Lambda), die eine Datei und lädt sie auf AWS S3 bekommt.
Der Frühling - Controller sendet eine MultipartFile
meiner Methode, wo es auf AWS S3 mit Amazon API Gateway hochgeladen wird .
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);
}
Ich versuche, eine PDF-Datei zu laden, die 2 Seiten mit Text hat. Nach dem Hochladen hat die PDF-Datei (auf AWS S3) 2 leere Seiten.
Warum ist die hochgeladenen PDF-Datei leer?
Ich habe auch versucht, mit anderen Dateien (wie PNG-Bild), und wenn ich es öffne das Bild I ist beschädigt hochgeladen.
Das einzige, was funktionierte, als ich eine Textdatei hochgeladen.
Es stellte sich heraus, dass dieser diesen Trick tun wird. Its all about Codierung, dank der Hilfe von @KunLun. In meinem Szenario ist, Datei die mehrt Datei (pdf), die aws über einen POST an die URL übergeben wird.
- Server erhält eine Datei mit diesem Byte -> 0010 (dies wird nicht richtig interpretiert werden, da ein Standard-Byte hat 8 Bit)
- so, wir kodieren sie in der Basis 64 -> keine Rolle spielt, was Ergebnis
- dekodieren es ein Standard-Byte zu erhalten -> 0000 0010 (das ist jetzt ein Standard-Byte und es interpretiert rechts von aws)
- Diese Quelle hier hat mir sehr geholfen als auch -> https://www.javaworld.com/article/3240006/base64-encoding-and-decoding-in-java-8.html?page=2
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);