PDA

View Full Version : [Java] Invio di una foto


DrZoidberg
02-10-2008, 21:52
Salve,
sto sviluppando una midlet in J2ME che scatta una foto e la invia ad uno script php. Vi illustro il procedimento logico:
- scatto la foto
- la foto una volta scattata viene memorizzata in formato binario (in un array di byte)
-codifico l'array di byte in stringa usando l'algoritmo Base64 (lo faccio x evitare perdita di informazione durante l'invio)...l'algoritmo mi ritorna una stringa
-a questo punto tramite una http connection invio la stringa allo script tramite una richiesta di tipo post (di tipo get è uguale?)
-lo script fa una request della stringa, la decodifica e la scrive all'interno di un file binario

Il ragionamento è giusto?? Che ne dite?? O si può fare anche in un altro modo?

cionci
03-10-2008, 07:59
Secondo me non ha senso la codifica in base64, non aggiunge sicurezza.
In ogni caso se il trasferimento avviene tramite http get o post le informazioni viaggiano tramite TCP. Quindi il TCP garantisce che lo stream sia stato trasmesso in maniera corretta.

Per il GET mi sembra che ci sia un limite sulla lunghezza, ma sinceramente non mi ricordo. Va bene POST.

DrZoidberg
03-10-2008, 12:40
Ho uno script php in cui viene passata una stringa che rappresenta un'immagine codificata in base64.
Lo script decodifica la stringa, crea un file .jpeg e ci scrive la decodifica!
E in teoria dovrebbe aver creato un foto con l'immagine...giusto???
E invece è vuoto!!!!!!!!

Come mai?
Ecco il codice

$foto = $_POST['foto'];
$a = base64_decode($foto);
$f = fopen("foto/prova.jpeg", "wb");
fwrite($f, $a);
fclose($f);

:help: :help:

incipit1970
03-10-2008, 16:32
Ho uno script php in cui viene passata una stringa che rappresenta un'immagine codificata in base64.
Lo script decodifica la stringa, crea un file .jpeg e ci scrive la decodifica!
E in teoria dovrebbe aver creato un foto con l'immagine...giusto???
E invece è vuoto!!!!!!!!

Come mai?
Ecco il codice

$foto = $_POST['foto'];
$a = base64_decode($foto);
$f = fopen("foto/prova.jpeg", "wb");
fwrite($f, $a);
fclose($f);

:help: :help:

Il codice PHP che alleghi sembrerebbe corretto, quindi probabilmente è il programma java a non passare bene il parametro foto.

Tieni di conto che GET e POST hanno modi diversi di passare i parametri, la POST è fatta per fare una submit di dati in un form. Possibilmente stai mandando una POST con i dati in stile GET?

Non so che libreria stai usando per fare la POST, se usi HttpConnection, tieni di conto che devi costruire la richiesta completamente, includendo il content-length. Se fai una post non puoi passare i dati nella url, ma devi settare il content-length e passare l'immagine nel corpo della richiesta.

Come dice cionci, la GET può avere limiti di lunghezza quindi è sconsigliata per trasportare grosse quantità di dati.

Ecco un esempio di una GET, come vedi, c'è solo l'header della request, non c'è body:


GET /index.html?userid=joe&password=guessme HTTP/1.1
Host: www.mysite.com
User-Agent: Mozilla/4.0


Questa invece è una POST, nota che sotto l'header "Content-Length" c'è il contenuto vero e proprio della richiesta. I parametri sono lì, ed il Content-Type è "application/x-www-form-urlencoded":


POST /login.jsp HTTP/1.1
Host: www.mysite.com
User-Agent: Mozilla/4.0
Content-Length: 27
Content-Type: application/x-www-form-urlencoded

userid=joe&password=guessme


Quindi, riassumendo, supponiamo che hai creato la HttpConnection, devi fare:


// Ottieni la foto
byte[] foto = ...;

// Converti a base64 con un encoder a tua scelta.
byte[] base64 = base64encode(foto);
// Converti il base64 in stringa URL Encoded con un encoder a tua scelta.
byte[] urlencoded = URLencode(base64);

// Ottieni la connessione.
HttpConnection conn = ...;
conn.setRequestMethod(HttpConnection.POST);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

// Setta la lunghezza della request
// content-length = lunghezza-nome-parametro + lunghezza-foto-encodata
conn.setRequestProperty("Content-Length", urlencoded.length + 5);
OutputStream os = conn.getOutputStream();
// Scrivi il nome del parametro
os.write("foto=".getBytes());
// Ora scrivi la foto encodata
os.write(urlencoded);

// Ora puoi inviare la richiesta.
....


Tieni di conto che i metodi base64encode() e URLEncode() usati nel codice sono di fantasia, dovrai trovare una qualche classe di libreria che faccia la conversione, oppure scriverla tu stesso.