2015-06-02 2 views
6

, was ich tueWer fügt " n" im Base64-kodierten Bild hinzu, wenn ich es in eine Datei schreibe? Java

ich über HTTPS senden müssen fordern Sie eine JsonArray mit einigen Daten und Bilder in Base64 codiert Strings. Dies funktioniert gut, wenn Daten im Speicher gespeichert werden.

Jetzt muss ich vermeiden, alle Daten im Speicher zu laden, und ich erstelle eine temporäre Datei in Android-Gerät mit allen Daten, die ich senden muss. Um die Datei zu erstellen, schreibe ich viele JsonObjects in ihm. Einige dieser JsonObjects haben ein Feld, das das Bild darstellt. Wenn ich einen erkenne, bekomme ich den Image-Pfad und ich kodiere ihn mit Base64 als String.

UPDATE:

Zunächst einmal ich inicialize die Datei und ich erhalte die BufferedWriter

  File f = new File(privateSincronizePath+File.separator+"upload_"+timefile+".json"); 
      f.createNewFile(); 
      FileWriter fw = new FileWriter(f.getAbsoluteFile(), true); 
      BufferedWriter bw = new BufferedWriter(fw); 

Hier ist der Code, der das Bild erstellen, wenn vorhanden:

  JSONObject jobInf = new JSONObject(); 
      jobInf.put("xx", "INSERT"); 
      jobInf.put("xx", c.getString(c.getColumnIndex("xx"))); 
      jobInf.put("xx", ""+c.getInt(c.getColumnIndex("xx"))); 
      jobInf.put("xx", c.getString(c.getColumnIndex("xx"))); 

      JSONObject jsonObject = new JSONObject(docu.filtre(dades, docu.getXx())); 
      Iterator<?> keys = jsonObject.keys(); 
      boolean updated = false; 
      while(keys.hasNext() && !updated){ 
       String key = (String)keys.next(); 
       if (key != null && key.equals("path") && key.length() > 0){ 
        jsonObject.put(key, getBase64EncodeFromImage(jsonObject.getString(key))); 
        updated = true; 
       } 
      } 

      jobInf.put("object", jsonObject); 

      escriure(bw, ","+jobInf.toString()); 

Methods scriure():

UPDATE: Diese Methode wird jedes Mal aufgerufen, wenn ich die Erstellung des JsonObject abschließe. Füge JsonObject nur als String an die Datei an.

private void escriure(BufferedWriter bw, String s) throws IOException { 
     uploadLength += s.length(); 
     bw.append(s); 
    } 

Schließlich, wenn die Datei erstellt wird, lese ich es und unter Verwendung von Output, ich bin die Daten als Beitrag Parameter an den Server sendet:

 this.Https_url = new URL(url+"/sync.php?"); 
     HttpsURLConnection con = (HttpsURLConnection) Https_url.openConnection(); 
     con.setReadTimeout(60000); 
     con.setConnectTimeout(60000); 
     con.setRequestMethod("POST"); 
     con.setDoInput(true); 
     con.setDoOutput(true); 
     con.setFixedLengthStreamingMode(uploadLength); 

     OutputStream os = con.getOutputStream(); 
     InputStream inp = new FileInputStream(new File(privateSincronizePath+File.separator+"upload_"+timefile+".json")); 
     byte[] buffer = new byte[1024]; 

     int len; 
     while ((len = inp.read(buffer)) != -1) { 
      os.write(buffer, 0, len); 
     } 
     inp.close(); 
     os.close();   

     // Establim la connexió: 
     con.connect(); 

was das Problem ist

Das Problem ist einfach. Wenn ich das Bild auf dem Server öffne, ist die Datei beschädigt und zeigt das Bild nicht an.

WAS bemerkte ich

Wenn ich das Bild Base64 codierten String erfassen, bevor Schreib in der Datei und lädt sie in dem Server, das Bild ist Ok! Nach dem Schreiben in die Datei scheint das Bild beschädigt zu sein.

Nach der Untersuchung, bemerkte ich, dass die Base64-codierte Zeichenfolge nach in der Datei geschrieben werden, es hat eine Menge von "\ n" alle x Zeichen. Wenn ich all diese "\ n" oder Bruchkanten lösche, kann das Bild vom Server korrekt geöffnet werden.

DIE FRAGE

, die diese Bruchkanten setzt? Wie kann ich das Base64 codieren als String "wie es ist"? Vielen Dank für Ihre Hilfe im Voraus!

DIE ANTWORT

Als Schoenobates Antwort war die Lösung, die die Flagge NO_WRAP verwenden. weitere Informationen hinzuzufügen, die wir in der Server-Seite setzen Sie diese Funktion, um die codierten Base64-String mit Flagge URL_SAFE

Die Funktion, auf coment of TOM in php.net erhalten in zu lesen ist:

<?php 
    function base64url_decode($base64url) 
    { 
     $base64 = strtr($base64url, '-_', '+/'); 
     $plainText = base64_decode($base64); 
     return ($plainText); 
    } 
    ?> 

Dank Stackoverflow, Axel und Schoenobates für deine Zeit!

+0

Ist der Code, wo Sie die temporäre Datei schreiben fehlt oder habe ich es übersehen? – Axel

+0

Ich aktualisiere meine Frage, um zu klären, wie ich die temporäre Datei schreibe. Ich schleife Daten und schreibe temporäre Datei zur gleichen Zeit. Vielen Dank! – jcasadellaoller

Antwort

15

Das wird die Android Base64-Klasse sein - Sie müssen die Flaggen können Sie die Zeilenumbrüche entfernen:

byte[] image = ...; Base64.encodeToString(image, Base64.NO_WRAP | Base64.URL_SAFE);

+0

Ich habe gerade getestet und das entfernt die "\ n"! Vielen Dank!!! Aber die Bilder werden nicht im Server angezeigt. Lass mich das Flag URL_SAFE ausprobieren und poste das Ergebnis. – jcasadellaoller

+0

Ja! Es klappt. Es ist sehr wichtig, sich daran zu erinnern, dass der Base64-Decoder im Safe-Modus auch den Server wechselt. Ich aktualisiere die Antwort dazu. 1000 Danke Schoenobates! Du sparst meinen Tag :) – jcasadellaoller

+0

Super! Keine probs @xikitidistant - froh zu helfen –

Verwandte Themen