[Risolto] File sul filesystem, mettere in un campo Blob del database

Lo so la richiesta è molto strana e allo stesso tempo pazza credo, ma mi hanno chiesto di fare quanto descritto in oggetto.

Ho un portale dove ho una form con un input di tipo file, dove il valore $_FILES['file']['tmp_name'] lo schiaffo in un campo blob del database e fin qui tutto ok.

Ora mi hanno chiesto di prendere dei file dal filesystem che uppano in una determinata cartella tramite ftp.

Io i file che mi trovo in questa cartella li devo andare ad aggiungere nella stessa stabella dove sono quelli immessi tramite form.

Fatta questa premessa la mia domanda è la seguente: una volta che ho il file ciccio.pdf come faccio ad estrapolare da esso quello che mi trovo dalla form in $_FILES['file']['tmp_name']??????

Grazie!

inviato 6 anni fa
JellyBelly
modificato 6 anni fa
Mario Santagiuliana
X 0 X

Operazioni sul filesystem in php:

http://php.net/manual/en/book.filesystem.php

Sulle directory:

http://www.php.net/manual/en/book.dir.php

Devi utilizzare un ciclo che apra la tua directory e legga i vari file in essa contenuti.

Devi dunque usare le funzioni opendir e readdir.

Interessante è anche la funzione scandir.

Facci sapere.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

quello da te descritto sono già riuscito a farlo e visto che ci sono lo posto anche che potrebbe sempre esser utile ai successivi lettori:

   public function getContentsDir($directory) {
      
      $contents = array ();
      
      if (is_dir ( $directory )) {
         
         $dir = opendir ( $directory );
         $i = 0;
         while ( false !== ($filename = readdir ( $dir )) ) {
            //Effettuo questo controllo per non prendere dir o file che iniziano col punto
            if (substr ( $filename, 0, 1 ) != '.') {
               $contents [$i] = new stdClass ();
               $type = filetype ( $directory . "/" . $filename );
               $size = filesize ( $directory . "/" . $filename );
               
               $contents [$i]->filename = $filename;
               $contents [$i]->type = $type;
               $contents [$i]->size = $size;
               $i ++;
            }
         }
         
         if (empty ( $contents ))
            $contents = "nofiles";
         
         closedir ( $dir );
         return $contents;
      } else {
         return $directory . " nodir";
      }
   }

Quello che mi manca è una volta che conosco il path totale al file, come diavolo faccio a tirar fuori quella stringa immonda di caratteri che compone il file per inserirlo nel campo blob? :D

Grazie!

risposto 6 anni fa
JellyBelly
X 0 X

Scusa dal codice che hai dato, $filename non è solo il nome del file?

A me risulta di si. Dunque dove sta il problema?

Il come inserirlo nel database? Ti basta una query, invece di passare il campo prelevato dal form passi il $filename no?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

mi devi scusare ma forse mi spiego male:

primo ci tengo a precisare che la variabile file name può essere il nome del file o della directory trovata, la differenza lo denota la variabile type.

Nel momento in cui ho sotto ciclo for il filename di tipo file ho il nome del file e dove sta, ma nel momento che ce l'ho nel db non ci devo mettere il nome del file, ma il suo contenuto, cioè i dati che compongono il file come nel caso della variabile $_FILE['file']['tmp_name'].

Il file una volta messo nel database lo devo eliminare dal filesystem! :P

Spero di essermi spiegato!

risposto 6 anni fa
JellyBelly
X 0 X

Certo, adesso ho capito  :D

Allora, per vedere se è un file o una directory puoi anche usare la funzione is_dir o is_file ;)

Per leggere il file puoi usare una di queste funzioni, credo tu debba scegliere quella che più si adatta alle tue necessità:

fread

readfile

file_get_contents

file

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Certo, adesso ho capito  :D

Allora, per vedere se è un file o una directory puoi anche usare la funzione is_dir o is_file ;)

Per leggere il file puoi usare una di queste funzioni, credo tu debba scegliere quella che più si adatta alle tue necessità:

fread

readfile

file_get_contents

file

 O0

 :clapping:

risposto 6 anni fa
JellyBelly
X 0 X

colgo ancora l'occasione della tua disponibilità per dire che mi sa che sto facendo una grandissima cazzata!!!

mi sono andato a rileggere dal manuale l'istruzione $_FILES e noto che la variabile dell'array [tmp_name] non è altro che il path del file uppato tramite post salvato nella dir tmp del server!!!!

Quindi io nel mio campo blob non devo far altro che metterci tutto il path del file sul mio filesystem (./uploads/files/cicco.pdf)?

Ma la cosa mi stranisce alquanto!!!!

Possibile che sia davvero così?

risposto 6 anni fa
JellyBelly
X 0 X

No...ma sei sicuro di aver salvato nel modo corretto i tuoi file nel campo blob e non di aver salvato solamente il path di questi?

risposto 6 anni fa
Mario Santagiuliana
X 0 X
No...ma sei sicuro di aver salvato nel modo corretto i tuoi file nel campo blob e non di aver salvato solamente il path di questi?

Allora per quanto riguarda il salvataggio tramite post via form nel campo blob ci salvo direttamente la variabile $_FILES['file']['tmp_name'] e funziona alla grande. Credo che in quel campo blob una volta che gli salvo questa variabile non ci sarà il path ma ci sarà il contenuto del file a quel path, credo! :D

Io vorrei riprodurre la stessa cosa (prendendo un determinato file sul filesystem), ma non credo che funzioni allo stesso modo se il gli passo un path diverso della tmp di php....

 :D

risposto 6 anni fa
JellyBelly
X 0 X

Ho scoperto l'arcano! :D

Mi sono stampato il contenuto del campo blob dopo un submit post form e il suo contenuto è identico al risultato della funzione:

file_get_contents($paththisfile);

Quindi dentro al campo blob non devo far altro che metterci il risultato della funzione file_get_contents!  O0

Spero che tutti questi miei post inutili possa servire anche ad altri con gli stessi dubbi! :D

 :bye:

risposto 6 anni fa
JellyBelly
X 0 X X

file_get_contents è la funzione che ti permette di leggere un file in binario.

Quello che non capisco è come fai a salvare un file dal tuo form se dai solo il path. I campi blob servono per salvare dati binari...puoi anche salvarci il path ma il file che fine farà? Tu alla query passi solo il path...non il file binario, o sbaglio?

Proverei a fare un piccolo backup del database, o un trasferimento e vedere che fine fanno questi file. Se hai salvato il path sicuramente non ritrovi i file ma il path in formato binario, se hai salvato i file allora li ripeschi...

O magari sto sbagliando io e basta fornire il path e non il contenuto binario...

Se usi solo il path dovresti usare la funzione di MySql LOAD_FILE.

risposto 6 anni fa
Mario Santagiuliana
modificato 6 anni fa
X 0 X

Ho verificato anche questo! :D

Nel db non ho path, ma binari!

nella variabile $_FILES['file']['tmp_name'] c'è il path al file nella cartella tmp di php che è una cosa tipo /var/tmp/shdjh67 e passando questo alla insert o update di mysql nel campo blob non salva "/var/tmp/shdjh67" ma salva il binario che sta dentro shdjh67!

Perlomeno credo! :D

Ciao

risposto 6 anni fa
JellyBelly
X 0 X

Come fai a dire per lo meno credo?

Tu stai salvando una stringa (/var/tmp/shdjh67) in un campo binario, non stai salvando il file...Ovviamente nel database non hai i path ma i binari, cioè hai i binari di una stringa.

Se tu elimini quel file poi lo recuperi?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Come fai a dire per lo meno credo?

Tu stai salvando una stringa (/var/tmp/shdjh67) in un campo binario, non stai salvando il file...Ovviamente nel database non hai i path ma i binari, cioè hai i binari di una stringa.

Se tu elimini quel file poi lo recuperi?

il test che ho fatto è spostare il database dal server a locale e se vado a prelevare quel file me lo trovo! Quindi deduco che è tutto regolare e non perdo il file! Quindi nel campo blob ho il binario del file e non il binario del path! ;)

risposto 6 anni fa
JellyBelly
X 0 X

Perfetto, allora da form inserisci i dati correttamente.

Verifica di farlo correttamente anche per le directory da ftp.

Ciao

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Perfetto, allora da form inserisci i dati correttamente.

Verifica di farlo correttamente anche per le directory da ftp.

Ciao

Già fatto! ;)

Grazie infinite!

 :bye:

risposto 6 anni fa
JellyBelly
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda