AWS Lambda und S3 - uploaded pdf-Datei ist leer / beschädigt

KunLun:

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 MultipartFilemeiner 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.

Lama:

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);

Ich denke du magst

Origin http://10.200.1.11:23101/article/api/json?id=478688&siteId=1
Empfohlen
Rangfolge