[PHP] Cercare l'ultima immagine caricata in una cartella datata

master1986

Utente Attivo
8 Ott 2012
233
0
16
Buon pomeriggio a tutti, dal titolo la cosa sembra un pò strana, ma cerco di spiegarmi meglio.
Ho una telecamera che ogni 5 minuti scatta una foto e la carica sul mio indirizzo ftp. La telecamera inoltre mi genera sottocartelle per archiviare le immagini, tipo : anno/mese/giorno.

Quello che mi servirebbe è di creare uno script per sapere l'ultimo file caricato nella cartella giornaliera dalla telecamera. Inoltre lo script deve tener conto che dopo la mezzanotte cambia l'orario, quindi dovrà puntare sempre su anno/mese/giorno

La mia struttura è la seguente:

www.miosito.it/telecamera/archivio/anno/mese/giorno

Lo script dovrà stare in telecamera e dovrà leggere come detto sopra l'ultima immagine contenuta nell'archivio. Io attualmente ho questa situazione:

www.miosito.it/telecamera/archivio/2019/03/29

Nella cartella "29" tengo questi file:

telecamera_201903291610.jpg
telecamera_201903291615.jpg
telecamera_201903291620.jpg
telecamera_201903291625.jpg
telecamera_201903291630.jpg

e così di seguito, ovviamente dopo la mezzanotte la telemera crea una nuova cartella. Lo script non dovrà far altro che farmi visualizzare l'ultimo file caricato. Tale nome lo utilizzerò per richiamare l'immagine in un altro script che mi occorre.


Vi ringrazio anticipatamente.
 

macus_adi

Utente Attivo
5 Dic 2017
1.265
82
48
IT/SW
Lo script dovrà stare in telecamera e dovrà leggere come detto sopra l'ultima immagine contenuta nell'archivio. Io attualmente ho questa situazione:
Dipende da come vuoi gestire il tutto, la parte più semplice visto la richiesta sarebbe aggiungere un file nella root/telecamera tipo:
tuosito.it/telecamera/last.txt
dove viene inserito il percorso dell'ultimo elemento creato...
tipo:
archivio/Y/m/d/file.ext

Quindi in questo scenario la camera come prenderà direttamente il percorso dell'ultima dell'immagine !
 

master1986

Utente Attivo
8 Ott 2012
233
0
16
Ciao, e se io volessi conoscere l'ultimo file inserito nella directory 29 (cartella che trae la data da oggi), poi sarà sufficiente sfruttare ora, data e anno del server per entrare nella directory ogni giorno. Più che file.txt a me servirebbe generare una vera e propria variabile, tipo echo $ultimo_file_inserito.jpg (ovviamente avrà il nome dell'ultima foto)
 

master1986

Utente Attivo
8 Ott 2012
233
0
16
Dipende da come vuoi gestire il tutto, la parte più semplice visto la richiesta sarebbe aggiungere un file nella root/telecamera tipo:
tuosito.it/telecamera/last.txt
dove viene inserito il percorso dell'ultimo elemento creato...
tipo:
archivio/Y/m/d/file.ext

Quindi in questo scenario la camera come prenderà direttamente il percorso dell'ultima dell'immagine !
questa cosa qui non posso farla
 

macus_adi

Utente Attivo
5 Dic 2017
1.265
82
48
IT/SW
come ti metti con la gestione di date diverse se non menzionate?
Un server a Roma e un server a New York se non settata correttamente la TIME_ZONE avranno due date diverse, quindi a mezzanotte potresti avere un risultato diverso rispetto a quello reale...
Creando "l'indice" dell'ultimo file creato hai sempre e soprattutto a prescindere dalla data dei vari server l'ultimo elemento creato...
questa cosa qui non posso farla
Sul tuo server non puoi creare un file txt e leggerlo con php?
 

marino51

Utente Attivo
28 Feb 2013
2.903
160
63
Lombardia
fatta salva la coerenza delle info contenute nelle cartelle,
upload_2019-3-29_19-52-54.png


userei questo script
PHP:
<?php
$dir = "telecamera/archivio";
$dir = newestFile($dir);  // anno
$dir = newestFile($dir);  // mese
$dir = newestFile($dir);  // giorno
$pic = newestFile($dir);  // immagine

function newestFile($dir) {
$files = scandir($dir, SCANDIR_SORT_DESCENDING);
$name  = $dir . "/" . $files[0];
echo $name . "<br />";
return $name;
}
?>
con questo risultato
upload_2019-3-29_19-54-38.png


ma mi sembra troppo semplice ….
 

macus_adi

Utente Attivo
5 Dic 2017
1.265
82
48
IT/SW
ma mi sembra troppo semplice ….
Non credo servisse la memorizzazione.....
Quello che mi servirebbe è di creare uno script per sapere l'ultimo file caricato nella cartella giornaliera dalla telecamera
Credo voglia il recupero dell'ultimo elemento caricato...
Infatti:
La persistenza vincola il programmatore ad un DB / DB flat etc.... COME CREI UNA VARIABILE DAL NULLA SENZA PERSISTENZA DEL DATO?
Che stando sotto directory a patto che non si faccia "RecursiveDirectoryIterator" e verifica del "filemtime" per il recupero dell'ultimo recuperato (quindi operazione onerosa e inutile), o si utilizza un DB o un file con l'ultimo elemento creato...

Credo!
 

master1986

Utente Attivo
8 Ott 2012
233
0
16
@macus_adi
ho difficoltà a capire quello che scrivi, ma,
Vedi l'allegato 6219
PHP:
<?php
$dir = "telecamera/archivio";
$dir = newestFile($dir);  // anno
$dir = newestFile($dir);  // mese
$dir = newestFile($dir);  // giorno
$pic = newestFile($dir);  // immagine

echo "<br />immagine scelta : " . $pic;

function newestFile($dir) {
$files = scandir($dir, SCANDIR_SORT_DESCENDING);
$name  = $dir . "/" . $files[0];
// echo $name . "<br />";
return $name;
}
?>
ancora semplice …..
altre considerazioni inutili ...

Grazie mille era quello che cercavo. Proprio così, però una cosa vorrei: ottenere solo il nome dell'immagine senza la directory stampata tipo:

telecamera_201903291615.jpg
 

macus_adi

Utente Attivo
5 Dic 2017
1.265
82
48
IT/SW
@macus_adi
ho difficoltà a capire quello che scrivi, ma,
Hai ragione @marino51 ho sbagliato, nessuno è perfetto....

altre considerazioni inutili ...
Nulla di personale (non è una faida, controlla quanto dirò e parliamo in modo pacifico), il tuo "ancora troppo facile" funziona malino ed è inconsistente, se aggiungessi un file in una directory preesistente questa non viene letta in modo coerente, ergo lo script seppur funziona con i meccanismi di time() non è completamente autonomo.
Es. pratico: Togliendo 1 sola profondità delle directory quindi immagina di non avere la dir "ANNO", tu punteresti sempre al mese 12, per non parlare delle risorse impiegate ed al tempo intercorso per effettuare l'ordinamento...

Il calcolo lo fai al volo:
1 foto ogni 5 minuti = 12 foto ogni ora * 24 = 288 * 30 giorni (diciamo) = 8640 foto al mese
mettiamo 2 anni = 8640 *24 = 207360
Prova con semplici file txt, poi fammi sapere...
Per completezza ti allego uno zip per effettuare delle "provole", alla fine dell'esecuzione dello script avrai 2 output:
1- Frutto del tuo script sopra, con calcolo temporale
2- Frutto dell'ottimizzazione in base alla posizione dell'ultimo file attraverso un semplice file txt con calcolo temporale
Naturalmente la prima esecuzione dello script prevede la generazione e la creazione dell'indice nel file txt...

Allego immagine con differenza di risultato e tempo d'esecuzione sui soli primi 3 mesi 2019, la differenza dei risultati è data dalla generazione dei file senza ordine per rendere lo script autonomo in ogni situazione e ad ogni profondità prendendo esattamente l'ultimo file creato...

telecamera_201903291615.jpg
PHP:
$a=explode('/',$file);
echo array_pop($a);
 

Allegati

Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
2.903
160
63
Lombardia
PHP:
<?php
$dir = "telecamera/archivio";
$dir = newestFile($dir);  // anno
$dir = newestFile($dir);  // mese
$dir = newestFile($dir);  // giorno
$pic = newestFile($dir);  // immagine

echo "<br />immagine scelta : " . $pic;
echo "<br />immagine scelta : " . $files[0];

function newestFile($dir) {
global $files;
$files = scandir($dir, SCANDIR_SORT_DESCENDING);
$name  = $dir . "/" . $files[0];
// echo $name . "<br />";
return $name;
}
?>
risultato
upload_2019-3-30_9-33-38.png


Ricorda sempre, che la struttura delle cartelle deve essere coerente
(cartella anno - cartella mese - cartella giorno - files della telecamera)
con questa premessa lo script si adatta alla situazione senza richiedere "manutenzione"
 
Ultima modifica:

macus_adi

Utente Attivo
5 Dic 2017
1.265
82
48
IT/SW
Ricorda sempre, che la struttura delle cartelle deve essere coerente
Vero... ma ogni volta crei l'indice e ricalcoli il tutto?
Con file ordinati la diff è mostrata in foto....
Risultati coincidenti, con un sensibile tempo d'esecuzione differente!
Buon Sabato!
test_order.png


La foto mostra l'esecuzione dello script sopra, ed i tempi possono variare da macchina a macchina...
 

master1986

Utente Attivo
8 Ott 2012
233
0
16
PHP:
<?php
$dir = "telecamera/archivio";
$dir = newestFile($dir);  // anno
$dir = newestFile($dir);  // mese
$dir = newestFile($dir);  // giorno
$pic = newestFile($dir);  // immagine

echo "<br />immagine scelta : " . $pic;
echo "<br />immagine scelta : " . $files[0];

function newestFile($dir) {
global $files;
$files = scandir($dir, SCANDIR_SORT_DESCENDING);
$name  = $dir . "/" . $files[0];
// echo $name . "<br />";
return $name;
}
?>
risultato
Vedi l'allegato 6222

Ricorda sempre, che la struttura delle cartelle deve essere coerente
(cartella anno - cartella mese - cartella giorno - files della telecamera)
con questa premessa lo script si adatta alla situazione senza richiedere "manutenzione"

Funziona alla grande! Era proprio quello che volevo grazie mille Marino!

Una cosa vorrei chiederti, ora che ho localizzato l'ultimo file, posso stamparlo a video con la libreria gd, in modo da poterci mettere su alcune scritte ecc, la conosco abbastanza la libreria. Ho la necessità di richiamare il file però.

Cosa mi consigli?
 

macus_adi

Utente Attivo
5 Dic 2017
1.265
82
48
IT/SW
buon sabato anche a te e consolati con i tuoi numeri (casuali)
Marino Marino.... Alcuni dubbi mi sono venuti, e in taluni casi ho constatato che...

Esegui il codice, non sparare a vanvera, consolati con me e i miei numeri casuali... che tanto cansuali non sono....
run.png

La prova la fai al volo....
e moltiplica x1000 i valori, poi ne riparliamo (cmq i numeri casuali toglili se mandano in confusione)...
Buon Sabato!
 

marino51

Utente Attivo
28 Feb 2013
2.903
160
63
Lombardia
Funziona alla grande! Era proprio quello che volevo grazie mille Marino!

Una cosa vorrei chiederti, ora che ho localizzato l'ultimo file, posso stamparlo a video con la libreria gd, in modo da poterci mettere su alcune scritte ecc, la conosco abbastanza la libreria. Ho la necessità di richiamare il file però.

Cosa mi consigli?
ho preso l'esempio dal manuale php, lo script diventa
PHP:
<?php
$workTime = - microtime(true);

$dir = "telecamera/archivio";
$dir = newestFile($dir);  // anno
$dir = newestFile($dir);  // mese
$dir = newestFile($dir);  // giorno
$pic = newestFile($dir);  // immagine

$workTime += microtime(true);

/*
echo "<br />immagine scelta : " . $pic;
echo "<br />immagine scelta : " . $files[0];
echo "<br />time spent : " . ( 1000 * $workTime ) . " milliseconds<br /><br />";
echo "<img src=".$pic.">";
*/

header('Content-Type: image/jpeg');
$img = imagecreatefromjpeg($pic);
imagejpeg($img);
imagedestroy($img);

function newestFile($dir) {
    global $files;
    $files = scandir($dir, SCANDIR_SORT_DESCENDING);
    $name  = $dir . "/" . $files[0];
    // echo $name . "<br />";
    return $name;
}
?>
ho passato alla funzione il nome del file completo del percorso, perché credo che nella tua applicazione il percorso possa essere differente
ho caricato una foto ed il browser la visualizza bene
upload_2019-3-30_20-39-7.png

attribuendo la proprietà del disegno ai figli dei carrugi di Albenga
 
Ultima modifica: