• User

    Salvare da Blob type a file

    Ciao, dovrei risolvere il seguente problema:

    ho una tabella di un DB mysql che contiene delle immagini. Le immagini sono memorizzate in un campo di tipo BLOB (in un altro campo ho il nome del file, che ha estensione jpg).
    Dovrei, attraverso una query, acquisire il file memorizzato nel campo BLOB e riconvertirlo in jpg senza pero' mostrarlo a video, al contrario devo spostarlo in una specifica directory del disco del server.
    Non so se sono stato sufficientemente chiaro.
    Grazie per l'attenzione.


  • User Attivo

    Ciao zambuten,
    non ho mai scritto file binari con php ma la funzione fwrite, come da manuale, sembrerebbe gestirli a dovere. Pertanto proporreri una cosa del tipo:

    $path='./img/'; //scelgo il percorso
    $file = $path.$result_query_1; //il risultato della query: nome file, preceduto dal path
    $fo = fopen($file, 'wb');
    **$imm = $result_query_2; //il risultato della query sul campo blob: dato binario **
    **fwrite($fo, $imm); **
    fclose($fo);

    Ovviamente abbi cura di inserire al posto della variabile $result_query_1 e $result_query_2 il risultato delle relative query.

    Tienici aggiornati sull'esito del tentativo, così aggiustiamo il tiro e lasciamo traccia ai posteri! 😄

    :ciauz:


  • User

    Grazie Ceccus.

    Premetto che sono un assoluto principiante quindi mi scuserai per eventuali castronerie od incomprensioni.

    Riporto il codice da te postato per fare alcune osservazioni:

    $path='./img/'; //scelgo il percorso
    $file = $path.$result_query_1; //il risultato della query: nome file, preceduto dal path
    **$fo = fopen($file, 'wb');
    **
    $file non esiste in concreto, io ho solo il nome del file memorizzato in un campo quindi non riesco a capire come posso fare un fopen() su un file che di fatto non esiste.

    **$imm = $result_query_2; //il risultato della query sul campo blob: dato binario **
    **fwrite($fo, $imm); **
    **fclose($fo);

    **infatti, seguendo le tue indicazioni ho questo messaggio di errore:

    Warning: fopen(./tmp/BSA00004.jpg) [function.fopen]: failed to open stream: No such file or directory in /u/www/executive.web/divIT/badge/fileFoto.php on line 46

    Warning: fwrite(): supplied argument is not a valid stream resource in /u/www/executive.web/divIT/badge/fileFoto.php on line 48

    Warning: fclose(): supplied argument is not a valid stream resource in /u/www/executive.web/divIT/badge/fileFoto.php on line 49

    in ogni caso riporto, escludendo le stringhe di connessione al DB, il mio codice:

    foreach($_POST["myarray"] as $id){

    $dati = mysql_query("SELECT * FROM tbadge WHERE idbadge = ('".$id."')");

    while($row = mysql_fetch_array($dati)){
    
        $path='./tmp/'; //scelgo il percorso
        $file = $path.$row['name']; //il risultato della query: nome file, preceduto dal path
        $fo = fopen($file, 'wb');
        $imm = $row['foto']; //il risultato della query sul campo blob: dato binario
        fwrite($fo, $imm);
        fclose($fo);
        
    }
    

    }


  • User

    Ho risolto utilizzando la suite di ImageMagick. :vaiii:
    Nel mio caso per ogni immagine memorizzata nella tabella tbadge nel campo di tipo blob, trovata dalla query, andro' a scrivere in una directory del disco del server l'immagine in formato jpg.
    Spero potra' essere d'aiuto ad altri utenti del forum. :ciauz:

    foreach($_POST["myarray"] as $id){

    $dati = mysql_query("SELECT * FROM tbadge WHERE idbadge = ('".$id."')");

    while($row = mysql_fetch_array($dati)){
    
    $tmpName  = "/tmp/foto/".$row["name"]; **//path nel quale verranno scritti i file**
    
    $mgck_wnd = NewMagickWand(); **//richiamo la risorsa MagickWand**
    
    MagickReadImageBlob($mgck_wnd, $row["foto"]); **//leggo l'immagine dal formato binario**
    MagickSetImageFormat($mgck_wnd, 'jpg'); **//converto l'immagine in formato jpg**
    MagickWriteImage($mgck_wnd, $tmpName); **//scrivo nella directory scelta l'immagine in formato jpg**
    
    }
    

    }