Salvare un'immagine codificata in base64

JellyBelly

Utente Attivo
4 Mar 2008
59
0
0
www.jellybellydev.it
Ciao a tutti, su una mia pagina ricevo in POST un'immagine allegata di un MMS

Esempio di una porzione dell'array di ricezione:

Codice:
[1] => Array
                (
                    [type] => image/gif
                    [filename] => image.gif
                    [content] => R0lGODlhJAAmAPcPAICAgOLi4j4+PnFxcdHR0WFhYbGxsY+Pj5+fn/Ly8lBQUCgoKMDAwAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAA8ALAAAAAAkACYAAAj/AB8IHEiw4AMCBgwQcGCwocOGAAQUUKCgwEQBCR5qJHhAgICKAxZ4pEgxwMaHAQZ8VABA5cgCAwa0zHiyoIGYABAAOKBgJUyZBwwwqEkwAAECDA4MQLAwKYCWT1sWAED0QQKECJQeQJCA4QCLYCfCrHpAacwBDAwMdLCyp0ePAwhodJCAAUWLAw4woCnQwFuRAgAXOAng7lOhBR30FMlYpAKTDWn6lAk5scfGjgc/JPB2KuKGIReIFu2xAFeHHUsDMOowAGbBCBA0RPC2okKNo0d/jMp3YOCXaTUiyL2AYkuZBnVXZDqXuMTjB5KTVqD3ZALSEnHqpTqQgHIADE++/82eV2HegQeUDyCaGuRSpBMHFtBdQC1RxzgDJCgsQP7oiuHVxEB2ABhQ1wA9+ScaRVU9oBhQDASAQAEeDWTAf7I16EBeCDig02JyWfXPgpVVJYBeDii1WGUjnhhgVQgYSAAAFIpG0AL/SFRiVQokMGGNCxAU0m8MOPCieAbQuNh63eX2EwIMHEWAfl0ZmcCVdHlXmAILcEdQRIC1dMBRZZl1VkwTuUVhYA0NSFpUUW711FdhUTReYEE25KROCmUVFZpp/jVabwTNR1oBWzGQ1gE0WuTWZbn155B30xkAJQN+VnQRnsR5ORt2WTGF6QGOupXbiNGdxMCCljKVZKBcnh+aZ00SjgQAQo3aiec/I4bYoEB1GaCiWxUV+OuxGwUEADs=
                )
Leggo l'array e mi salvo i valori in delle variabili:

PHP:
$typeImg=$result['attachments'][1]['type'];
$filenameImg=$result['attachments'][1]['filename'];
$contentImg=$result['attachments'][1]['content'];
Eseguo la decodifica dell'immagine in questo modo:

PHP:
$img = base64_decode($contentImg);
echo $img;
ecco il risultato:
Codice:
GIF89a$�&�÷�€€€âââ>>>qqqÑÑÑaaa±±±ŸŸŸòòòPPP(((ÀÀÀ���ÿÿÿ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!ù���,����$�&��ÿ�H°àp`°¡Ã†�P  ÀD j$x@€€Šx¤H1ÀƇ|T�@åÈ´Ìx² ˜��8 `%L™0¨I0�@°0)€–O[�@ôA„”@€á�‹`'¬z@iÌt°²§Ght€E‹0 )ÐÀ[‘�8 àîS¡ôÉX¤“ iú” 9±ÇÆŽ?$ðv*â†!ˆí±�W‡K0ê0�fÁ4Dð¶¢B£GŒÊw`à—i5"Ƚ€bK™uWd:—¸Äã’“V ÷dÒqê¥:€r�O¾ÿÍžWaÞ” šäR¤Ð]@-QÇ8$(,@þèŠáÕÄ@v�P×�=ù'EU= P€@ dÀ²5è@^8 ÓbrYõÏ‚•U%€^(µXe#ž`UH��ŠFÐÿHTbU $0aÒo8ð¢xиØzÝåöE€~]™À•tyW˜pGPD€µtÀQe™uVL¹Ea` HZTQnõÔWaQ4^`A6ä¤N ešiþ5ZoÍGZ[1Ö4ZäÖe¹õçwÓ�%~VtžÄy9vY1…鎺•ÛˆÑÄÀ‚–2•d \žšgMŽ�BÚ‰ç?#†Ø @u ¢[øë±�;
Sono consapevole che è sbagliatissimo fare echo $img, ma era giusto per informazione! :D

Il mio problema è: come faccio a salvare quest'immagine sul filesystem in modo da poterla visualizzare?

Sono disperato! Vi prego di aiutarmi!
Ciao
Andrea
 
Hai provato così:

PHP:
$fp = fopen($filenameImg, "wb");
fwrite($fp, $img);
fclose($fp);
 
Ultima modifica:
Hai provato così:

PHP:
$fp = fopen($filenameImg, "wb");
fwrite($fp, $img);
fclose($fp);

Prima di tutto grazie per l'aiuto!

Ora scusa l'ignoranza, non sono molto pratico di php!
Eseguendo queste operazioni cosa dovrebbe accadere?
Ho fatto delle prove:
PHP:
$img = base64_decode($contentImg);    
    $fp = fopen($filenameImg, "wb");
    fwrite($fp, $img);
    fclose($fp);     
    echo $fp;

il risultato dell'echo è::
Codice:
Resource id #3

Ora che faccio?
 
scusami ho parlato troppo presto, ho appena notato che l'immagine è stata creata! ;)
adesso come faccio a indicare il path dedicato dove salvare l'immagine? Ora come ora me la salva nella posizione dove risiede il file che compie l'operazione!

Grazie mille!
 
Come consiglio ti posso dire di guardare qui quando trovi qualche funzione che non conosci PHP Manual, ma sarò bravo:

La funzione fopen apre un file, il primo parametro passato indica il file. Qui puoi anche specificare il path del file. Il secondo parametro indica le modalità di apertura del file: la w dice di aprire il file in scrittura, se il file non esiste viene creato, se esiste viene sovrascritto; la btratta i dati come binari, evitando eventuali conversioni di caratteri speciali. La funzione ritorna un handle al file ($fp).
Con fwrite dico di scrivere nel file identificato da $fp i dati contenuti nella variabile $img.
Per ultimo fclose rilascia l'handle al file.

NB. specificando il path del file, i backslash '\' devono essere raddoppiati, per cui: $fp=fopen("C:\\path\\to\\file\\image.gif","wb")

Spero di essere stato abbastanza chiaro
 
Come consiglio ti posso dire di guardare qui quando trovi qualche funzione che non conosci PHP Manual, ma sarò bravo:

La funzione fopen apre un file, il primo parametro passato indica il file. Qui puoi anche specificare il path del file. Il secondo parametro indica le modalità di apertura del file: la w dice di aprire il file in scrittura, se il file non esiste viene creato, se esiste viene sovrascritto; la btratta i dati come binari, evitando eventuali conversioni di caratteri speciali. La funzione ritorna un handle al file ($fp).
Con fwrite dico di scrivere nel file identificato da $fp i dati contenuti nella variabile $img.
Per ultimo fclose rilascia l'handle al file.

NB. specificando il path del file, i backslash '\' devono essere raddoppiati, per cui: $fp=fopen("C:\\path\\to\\file\\image.gif","wb")

Spero di essere stato abbastanza chiaro


Non sei stato gentile! Di più!!!
Cmq per molte cose che hai detto ci ero arrivato! Mi sono andato a studiare la fopen e la fclose per capire dove indicare il path dove scrivere l'img ma non riuscivo a capire, alla fine ho risolto così!

PHP:
// Decodifico l'immagine
    $img = base64_decode($contentImg);
    
    // Creo l'immagine
    $fp = fopen("./attach/".$filenameImg, "wb");
    fwrite($fp, $img);
    fclose($fp); 
    
    echo "<img src=".$filenameImg.">";

Grazie ancora! ;)
 
scusa se ti disturbo ancora, ho provato a testare l'implementazione sul server e falle funzioni fread, fwrite e fclose ricevo dei Warning

Codice:
Warning: fopen(./attach/image.gif): failed to open stream: Permission denied in /home/httpd/vhosts/***/test.php on line 41

Warning: fwrite(): supplied argument is not a valid stream resource in /home/httpd/vhosts/***/test.php on line 42

Warning: fclose(): supplied argument is not a valid stream resource in /home/httpd/vhosts/***/test.php on line 43

Ma in locale non me li dava!
Ho cambiato anche i permessi della cartella a 777, ma il risultato non cambia!

Lo script funziona come nel mio post precedente!
Ho sbagliato qualcosa?
Come posso risolvere?
Grazie
 
Con che utente gira Apache? Come test prova ad andare nella cartella dove risiede lo script PHP, e come root fai:

Codice:
# su <nome_utente_apache>
$ touch ./attach/image.gif

Poi dicci un po' cosa succede...
 
Con che utente gira Apache? Come test prova ad andare nella cartella dove risiede lo script PHP, e come root fai:

Codice:
# su <nome_utente_apache>
$ touch ./attach/image.gif

Poi dicci un po' cosa succede...

Non ho i permessi di root sul server!
Io ho preso solo il dominio!
Il Server non è mio purtroppo! :(

Ho accesso solo al DB e a FTP! I permessi li cambio tramite il mio client FTP!
 
Ok, allora altro tentativo:

crea un cartella, e lì dentro mettici un file di readme.txt e uno script fatto così:
PHP:
$filename = 'readme.txt';

if (file_exists($filename)) {
    echo 'The file ' . $filename . ' exists';
    if (is_readable($filename)) {
        echo 'The file ' . $filename . ' is readable';
        if (is_writable($filename)) {
            echo 'The file ' . $filename . ' is writable';
        }
        else {
            echo 'The file ' . $filename . ' is not writable';
        }
    }
    else {
        echo 'The file ' . $filename . ' is not readable';
    }
} else {
    echo 'The file ' . $filename . ' does not exist';
}

E vediamo cosa ti ritorna
 
Ok, allora altro tentativo:

crea un cartella, e lì dentro mettici un file di readme.txt e uno script fatto così:
PHP:
$filename = 'readme.txt';

if (file_exists($filename)) {
    echo 'The file ' . $filename . ' exists';
    if (is_readable($filename)) {
        echo 'The file ' . $filename . ' is readable';
        if (is_writable($filename)) {
            echo 'The file ' . $filename . ' is writable';
        }
        else {
            echo 'The file ' . $filename . ' is not writable';
        }
    }
    else {
        echo 'The file ' . $filename . ' is not readable';
    }
} else {
    echo 'The file ' . $filename . ' does not exist';
}

E vediamo cosa ti ritorna

Ecco il risultato con permessi a 777:
The file readme.txt exists
The file readme.txt is readable
The file readme.txt is not writable

Con permessi 755:
The file readme.txt exists
The file readme.txt is readable
The file readme.txt is not writable
 
Scusami, ma i permessi li hai dati al file o alla cartella? Perchè 777 e 755 non mi sembrano i permessi di un semplice file di testo. Potresti farmi vedere un 'ls'?
Dopo questo l'unica cosa che mi viene in mente è provare a chiedere a chi ti da lo spazio se per caso hanno dei blocchi in scrittura tipo selinux o cose simili.
 
Scusami, ma i permessi li hai dati al file o alla cartella? Perchè 777 e 755 non mi sembrano i permessi di un semplice file di testo. Potresti farmi vedere un 'ls'?
Dopo questo l'unica cosa che mi viene in mente è provare a chiedere a chi ti da lo spazio se per caso hanno dei blocchi in scrittura tipo selinux o cose simili.

Di default la cartella sta a 755 e i file a 644!

Se metto 777 alla cartella, metto anche il suo contenuto a 777!
 
Mi spiace ma questo non è automaticamente vero.

Se fai
Codice:
chmod 777 <nome_cartella>
i file contenuti all'interno non cambiano i permessi.
Dovresti fare
Codice:
chmod -R 777 <nome_cartella>
per cambiare i permessi anche ai file contenuti, ma non mi sembra
che via FTP sia possibile farlo.

In ogni caso, potresti fare un 'ls' della cartella dove c'è lo script ed il file readme.txt?
 
Mi spiace ma questo non è automaticamente vero.

Se fai
Codice:
chmod 777 <nome_cartella>
i file contenuti all'interno non cambiano i permessi.
Dovresti fare
Codice:
chmod -R 777 <nome_cartella>
per cambiare i permessi anche ai file contenuti, ma non mi sembra
che via FTP sia possibile farlo.

In ogni caso, potresti fare un 'ls' della cartella dove c'è lo script ed il file readme.txt?

Hai ragione il chmod via client ftp non è ricorsivo, cmq andando a settare 777 anche i file all'interno il respondo è il seguente:

The file readme.txt exists
The file readme.txt is readable
The file readme.txt is writable

Adesso ho messo 644 al mio script di prima e anche alla cartella dove eseguire le fopen etc 777 e ora i warning non compaiono!

Ma mica è una cosa buona avere 777???
 

Discussioni simili