2015-06-02 9 views
6

quello che sto facendoChi sta aggiungendo " n" nell'immagine codificata Base64 quando lo scrivo in un file? Java

ho bisogno di inviare tramite HTTPS richiedere un JsonArray con alcuni dati e immagini in stringhe Base64 codificati. Funziona bene se i dati sono archiviati in memoria.

Ora, ho bisogno di evitare di caricare tutti i dati in memoria e sto creando un file temporaneo nel dispositivo Android con tutti i dati che ho bisogno di inviare. Per creare il file, sto scrivendo un sacco di JsonObjects dentro di lui. Alcuni di questi oggetti Json hanno un campo che rappresenta l'immagine. Quando ne rilevo uno, ottengo il percorso dell'immagine e lo codifico con Base64 come String.

UPDATE:

Prima di tutto, ho inicialize il file e ottengo il 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); 

Qui è il codice che creano l'immagine quando esiste:

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

Method escurure():

UPDATE: Questo metodo viene chiamato ogni volta che completa la creazione di JsonObject. Aggiungi solo JsonObject come stringa al file.

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

Infine, quando viene creato il file, lo sto leggendo e, usando OutputStream, sto inviando i dati come parametri POST al server:

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

QUAL È IL PROBLEMA

Il problema è semplice. Quando apro l'immagine nel server, il file è danneggiato e non mostra l'immagine.

Quello che ho notato

Se mi cattura la stringa Base64 immagine codificata, prima di scrivere nel file, e lo carica nel server, l'immagine è Ok! Quindi, dopo aver scritto nel file, l'immagine sembra essere corrotta.

Dopo aver esaminato, ho notato che la stringa codificata Base64 dopo essere stata scritta nel file, ha un sacco di "\ n" ogni x caratteri. Se cancello tutto questo "\ n" o le linee di separazione, l'immagine può essere aperta correttamente dal server.

LA QUESTIONE

che sta mettendo questo linee di discontinuità? Come posso scrivere Base64 codificato come String "as is"? Grazie a tutti per il vostro aiuto in anticipo!

LA RISPOSTA

Come Schoenobates risposta, la soluzione era utilizzare la NO_WRAP bandiera. Per aggiungere ulteriori informazioni, abbiamo messo in lato server questa funzione per leggere la stringa Base64 codificato con la bandiera URL_SAFE

La funzione, ottenuta in su coment of TOM in php.net è:

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

Grazie a StackOverflow, Axel e Schoenobates Per il tuo tempo!

+0

è il codice in cui si sta scrivendo il file temporaneo mancante o lo ho affacciano esso? – Axel

+0

Aggiorno la mia domanda per chiarire come sto scrivendo il file temporaneo. I loop dati e scrivo il file temporaneo allo stesso tempo. Grazie! – jcasadellaoller

risposta

15

che sarà la classe Base64 Android - è necessario impostare i flag per rimuovere i ritorni a capo:

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

+0

Ho appena provato e questo rimuove "\ n"! Grazie!!! Ma le immagini non vengono mostrate già nel server. Fammi provare la bandiera URL_SAFE e pubblica il risultato. – jcasadellaoller

+0

Sì! Funziona. È molto importante ricordare di modificare nel server il decodificatore Base64 anche per utilizzare la modalità provvisoria. Aggiorna la risposta con questo. 1000 grazie Schoenobates! Mi hai salvato la giornata :) – jcasadellaoller

+0

Fantastico! Nessun problema @xikitidistant: felice di aiutare –