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!
è il codice in cui si sta scrivendo il file temporaneo mancante o lo ho affacciano esso? – Axel
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