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
 

Trogo

Utente Attivo
11 Gen 2008
370
0
0
43
Sanremo
Hai provato così:

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

JellyBelly

Utente Attivo
4 Mar 2008
59
0
0
www.jellybellydev.it
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?
 

JellyBelly

Utente Attivo
4 Mar 2008
59
0
0
www.jellybellydev.it
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!
 

Trogo

Utente Attivo
11 Gen 2008
370
0
0
43
Sanremo
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
 

JellyBelly

Utente Attivo
4 Mar 2008
59
0
0
www.jellybellydev.it
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! ;)
 

JellyBelly

Utente Attivo
4 Mar 2008
59
0
0
www.jellybellydev.it
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
 

Eliox

Utente Attivo
25 Feb 2005
4.390
3
0
Hai esteso i permessi anche ai file e alle sottocartelle?
 

Trogo

Utente Attivo
11 Gen 2008
370
0
0
43
Sanremo
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...
 

JellyBelly

Utente Attivo
4 Mar 2008
59
0
0
www.jellybellydev.it
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!
 

Trogo

Utente Attivo
11 Gen 2008
370
0
0
43
Sanremo
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
 

JellyBelly

Utente Attivo
4 Mar 2008
59
0
0
www.jellybellydev.it
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
 

Trogo

Utente Attivo
11 Gen 2008
370
0
0
43
Sanremo
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.
 

JellyBelly

Utente Attivo
4 Mar 2008
59
0
0
www.jellybellydev.it
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!
 

Trogo

Utente Attivo
11 Gen 2008
370
0
0
43
Sanremo
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?
 

JellyBelly

Utente Attivo
4 Mar 2008
59
0
0
www.jellybellydev.it
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
Autore Titolo Forum Risposte Data
B Selezionare un'immagine e salvare la selezione Photoshop 3
Stex1967 Salvare una immagine che si trova su porta TCP 8080 di altro sito PHP 7
L salvare una immagine elaborata in canvas Javascript 1
L salvare una immagine elaborata in canvas Javascript 1
D [Javascript] salvare immagine canvas - paypal Javascript 0
A Salvare immagine ridimensionata in MySql con GD PHP 12
F Cliccare e salvare src immagine HTML e CSS 2
I Salvare indirizzo immagine in database PHP 6
P C# Salvare una colonna del DataGridView XML 0
E fpdf salvare e aprire il file PHP 4
I salvare testo chat PHP 4
E Salvare immagini PHP 0
L salvare codice html in mysql PHP 3
L salvare somma con sottrazione PHP 1
M Salvare coordinate Maps nel DB PHP 2
D SALVARE "MASCHERA" + "ALLEGATO PDF" IN UN UNICO PDF MS Access 0
A Twitter aggiungere tweet a campagna esistente o salvare pubblico Social Media Marketing 0
D Salvare in diversi campi mysql con diversi ID PHP 0
M Salvare JSONObject in Shared Preference Sviluppo app per Android 0
M [PHP] Salvare campo di una tabella in una variabile PHP 14
S [ASP] SALVARE VALORE SELECT OPTION SU CAMPO TABELLA ACCESS Classic ASP 9
M [PHP] FPDF Salvare su disco C locale Windows PHP 3
C Photoshop CS 6 salvare una modifica Photoshop 0
L [PHP] Salvare csv da form dati PHP 5
G php salvare file in campo blob mysql: massimo 4MB PHP 1
M Salvare pagine web come segnalibro con istruzioni javascript Javascript 0
L Salvare posizione maps Sviluppo app per Android 0
G [PHP] SALVARE RECORD ESTRATTI DA DATABASE PHP 6
D Come salvare scelta della select "dinamica" ajax-php? Come dato php o attributo value tag option? Ajax 5
P [SOLVED] salvare il TCPDF output in mysql e rivisualizzarlo PHP 3
M Salvare i dati nel db e aprire altra pagina php PHP 7
M Form ASP su MsSQL salvare 2 campi in 1 Classic ASP 4
V [PHP] Salvare campo radio in db e leggerlo PHP 15
S [PHP] Salvare dati tabella in formato exel PHP 0
Benix89 Come salvare radio button selezionato Magento 1
Benix89 Salvare radio button selezionato PHP 2
P Come salvare il proprio diario di fb Discussioni Varie 0
P Salvare i dati restituiti dopo autenticazione OAuth2 Javascript 0
M Salvare in tabella link file importato PHP 1
M Cartella predefinita dove salvare i backup PHP 0
P dove si va a salvare il dbase phpmyadm una volta creato ???? Database 0
P dove si va a salvare il dbase phpmyadm una volta creato ???? Database 7
C Salvare il click su di un Button Sviluppo app per Android 9
Emix Salvare documenti in DB PHP 3
D salvare righe dinamicamente PHP 3
R Mettere la possibilità di Salvare in un gioco =) Come si fa? Java 2
C Salvare dati form in un file di testo PHP 1
M Salvare select con cookie PHP 1
IImanuII Salvare/recuperare html da un db PHP 5
S Salvare dei dati in una determinata tabella in base al select che l'utente seleziona PHP 8

Discussioni simili