2 Stimmen

Base64-Kodierung eines Bildes in Java offenbar falsch, was übersehe ich?

Ich versuche, ein Base64-kodiertes Bild aus meinem Java-Code auf einer Website zu POSTen. Ich habe die Kodierung und Dekodierung der Datei lokal getestet und es funktioniert wunderbar! Wenn es jedoch auf der Website ankommt, wird mir gesagt, dass das Bild leer ist.

Hier ist, wie ich POST'ing. Wenn ich eine andere Aktion anstelle von Upload verwende, erhalte ich die richtige Antwort!

ready = new java.net.URL(url);
        WebRequest request = new WebRequest(ready, HttpMethod.POST);
        request.setAdditionalHeader("Content-Type", "application/x-www-form-urlencoded");

        String requestBody = "action=upload"
                +"&key=ABCDEFG123456"
                + "&file=" + encodedFile
                + "&gen_task_id=" + SQL.getNextID();

encodedFile stammt aus dem folgenden Code:

    File file = new File("temp.jpg");

    FileInputStream fin = new FileInputStream(file);

    byte fileContent[] = new byte[(int)file.length()];
    fin.read(fileContent);

    //all chars in encoded are guaranteed to be 7-bit ASCII
    byte[] encoded = Base64.encodeBase64(fileContent);
    String encodedFile = new String(encoded);

Ernsthaft, was mache ich falsch? Ich schlage jetzt schon seit Stunden meinen Kopf gegen die Wand!

3voto

David Punkte 1296

Endlich habe ich es herausgefunden. Hier ist, was ich tat, für alle anderen, die dieses Problem haben.

BufferedImage img = ImageIO.read(new File("temp.jpg"));             
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "jpg", baos);
baos.flush();
Base64 base = new Base64(false);
String encodedImage = base.encodeToString(baos.toByteArray());
baos.close();
encodedImage = java.net.URLEncoder.encode(encodedImage, "ISO-8859-1");
request.setRequestBody(encodedImage);

1voto

sir_jimmy Punkte 11

FileInputStream.read(byte[] b) garantiert nicht, dass der Byte-Array-Puffer b vollständig ausgefüllt werden, auch wenn die Daten vorhanden sind. Der folgende Code stellt sicher, dass der Puffer vollständig gefüllt ist.

File file = new File("temp.jpg");

FileInputStream fin = new FileInputStream(file);

byte fileContent[] = new byte[(int)file.length()];
int offset = 0;

while ( offset < fileContent.length ) {
    int count = fin.read(fileContent, offset, fileContent.length - offset);
    offset += count;
}

//all chars in encoded are guaranteed to be 7-bit ASCII
byte[] encoded = Base64.encodeBase64(fileContent);
String encodedFile = new String(encoded);

Alternativ können Sie auch Folgendes verwenden ByteArrayOutputStream wie diese:

File file = new File("temp.jpg");

FileInputStream fin = new FileInputStream(file);
ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte [] buffer = new byte[1024];
int count = 0;

while ( (count = fin.read(buffer)) != -1 ) {
    baos.write(buffer, 0, count);
}

byte [] fileContent = baos.toByteArray();

//all chars in encoded are guaranteed to be 7-bit ASCII
byte[] encoded = Base64.encodeBase64(fileContent);
String encodedFile = new String(encoded);

Oder Sie können Ihr Auto einpacken FileInputStream Objekt in einer DataInputStream Objekts wie dieses:

File file = new File("temp.jpg");

FileInputStream fin = new FileInputStream(file);
DataInputStream dis = new DataInputStream(fin);

byte fileContent[] = new byte[(int)file.length()];
dis.readFully(fileContent);

//all chars in encoded are guaranteed to be 7-bit ASCII
byte[] encoded = Base64.encodeBase64(fileContent);
String encodedFile = new String(encoded);

Ich bin sicher, dass es noch weitere Möglichkeiten gibt, dies zu erreichen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X