[PHP] Verwijderen van tijdelijke bestanden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • aschwinvanosch
  • Registratie: April 2006
  • Laatst online: 12-12-2024
Op het moment ben ik bezig met een site waarop mensen hun eigen foto kunnen uploaden.
Nu is het echter de bedoeling dat mensen eerst een voorbeeld te zien krijgen.
Deze voorbeelden dienen dus eerst op de site geplaatst te worden, als mensen de foto erop hebben gezet en de site verlaten blijft deze op de site staan.

Nu wil ik een php script draaien dat foto's ouder dan 2/3 dagen verwijderd.
Ik heb nu in de bestandsnaam de datum al openomen:
$datum = date("dmY");
$file_name = $_FILES['foto_upload']['name'];
$fotonaam = $datum . "_" . $file_name;
Nu vraag ik me af hoe ik de bestandsnamen uit kan lezen en de eerste 8 karakters kan gebruiken om op datum te controleren zodat ik de bestande met een oudere datum kan unlinken.

Het gaat mij er nu dus eigenlijk om hoe ik alle bestanden uit de directory check, door middel van het uitlezen van de bestandsnaam en dan wil ik de eerste 2 karakters, de 2 daaropvolgende en de 4 daar weer op volgende gescheiden uitlezen.

Kan iemand mij hier bij helpen?

Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Met de directory- en string-functies van PHP? :)

Gewoon een kwestie van door alle bestanden in een map heenlopen en met substr de juiste karakters eruit selecteren.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • aschwinvanosch
  • Registratie: April 2006
  • Laatst online: 12-12-2024
Ik ga het even proberen!

Alvast bedankt voor je snelle reactie :)

Acties:
  • 0 Henk 'm!

  • aschwinvanosch
  • Registratie: April 2006
  • Laatst online: 12-12-2024
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    $datum_dag1     = date("d");
    $datum_dag1     = $datum_dag1 - 2;
    $datum_maand1   = date("m");
    $datum_jaar1    = date("Y");

    foreach (glob("image/*.*") as $filename) {

    while ($filename[$positie] != ""){
    $positie = $positie + 1;
    }

    $datum_dag2     = $filename[6].$filename[7];
    $datum_maand2   = $filename[8].$filename[9];
    $datum_jaar2    = $filename[10].$filename[11].$filename[12].$filename[13];
    
    echo $datum_dag2 . $datum_maand2 . $datum_jaar2 . "<br>";
    $positie = 0;
    
    if ($datum_jaar2 < $datum_jaar1){
        unlink($filename);  } 
        
        elseif ($datum_maand2 < $datum_maand1){
                unlink($filename);  } 
        
            elseif ($datum_dag2 < $datum_dag1){
                    unlink($filename);  } 
    
    }


Zo heb ik het uiteindelijk opgelost, de afbeeldingen ouder dan 2 dagen worden automatisch verwijderd. :)

Thanks!

[ Voor 9% gewijzigd door een moderator op 09-03-2007 14:52 ]


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 22:47
Is het trouwens niet handiger voor je om dat soort gegevens in een database op te slaan? Dingen als naam van de foto, uploader, grootte, etc zeg maar? Dan kun je ook een stuk makkelijker dingen ouder dan 3 dagen verwijderen door simpel een query a la select bestandsnaam where date < NOW() - INTERVAL 3 DAY uit te voeren :)

Met jou script krijg je nu een grappig resultaat op de eerste dag van de maand ;)

[ Voor 11% gewijzigd door FragFrog op 09-03-2007 14:53 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Sowieso lijkt het me handiger om de datum en tijd van een bestand op te vragen middels de daarvoor geschreven functie:
PHP:
1
filemtime($filename);

Hiermee krijg je de UNIX-timestamp (aantal seconden sinds 01/01/1970 00:00, epoch) terug. Kijk hier voor de manual met tips.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Spockz
  • Registratie: Augustus 2003
  • Laatst online: 21-09 10:08

Spockz

Live and Let Live

bovendien hou je nu zelf een key (position) bij. Volgensmij kun je beter de key uit de foreach gebruiken of een for gebruiken.

C'est le ton qui fait la musique. | Blog | @linkedin
R8 | 18-55 IS | 50mm 1.8 2 | 70-200 2.8 APO EX HSM | 85 1.8


Acties:
  • 0 Henk 'm!

  • aschwinvanosch
  • Registratie: April 2006
  • Laatst online: 12-12-2024
FragFrog schreef op vrijdag 09 maart 2007 @ 14:52:
Is het trouwens niet handiger voor je om dat soort gegevens in een database op te slaan? Dingen als naam van de foto, uploader, grootte, etc zeg maar? Dan kun je ook een stuk makkelijker dingen ouder dan 3 dagen verwijderen door simpel een query a la select bestandsnaam where date < NOW() - INTERVAL 3 DAY uit te voeren :)

Met jou script krijg je nu een grappig resultaat op de eerste dag van de maand ;)
Dat van de eerste dag van de maand had ik nog niet over na gedacht, volgens mij duurt het dan gewoon 1 dag langer op de eerste dag van de maand. Of heb ik dat mis?

Verder gaat het er alleen om dat mensen een foto kunnen uploaden en hem dan kunnen bekijken. Deze bestanden komen in een tijdelijke map zonder extra gegevens.

Wanneer er een bestelling wordt geplaatst zal de foto overgezet worden naar de bestel map.

Acties:
  • 0 Henk 'm!

  • aschwinvanosch
  • Registratie: April 2006
  • Laatst online: 12-12-2024
FragFrog schreef op vrijdag 09 maart 2007 @ 14:52:
Is het trouwens niet handiger voor je om dat soort gegevens in een database op te slaan? Dingen als naam van de foto, uploader, grootte, etc zeg maar? Dan kun je ook een stuk makkelijker dingen ouder dan 3 dagen verwijderen door simpel een query a la select bestandsnaam where date < NOW() - INTERVAL 3 DAY uit te voeren :)

Met jou script krijg je nu een grappig resultaat op de eerste dag van de maand ;)
Ik wil het toch ook gaan proberen door middel van een database.
Heeft ook als voordeel dat het sneller werkt waarschijnlijk.
Echter in welk formaat dien ik de datum weg te schrijven, of kan ik dit in PhpMyAdmin gewoon als timestamp kiezen?

Thanks alvast!

Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 22:05
aschwinvanosch schreef op vrijdag 09 maart 2007 @ 15:12:
[...]


Ik wil het toch ook gaan proberen door middel van een database.
Heeft ook als voordeel dat het sneller werkt waarschijnlijk.
Echter in welk formaat dien ik de datum weg te schrijven, of kan ik dit in PhpMyAdmin gewoon als timestamp kiezen?

Thanks alvast!
Wat denk je van een date veld? En als je wil weten in welk formaat je de string aan moet bieden aan de database: http://dev.mysql.com/doc/refman/5.0/en/datetime.html :).

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 22:47
Persoonlijk geef ik de voorkeur aan een timestamp, MySQL kan hier goed mee overweg, dus vrij ideaal. Alternatieven zijn datetime of als je echt bang bent dat je echt heel veel fotos krijgt date ;)

Een timestamp heeft als bijkomend voordeel dat MySQL 'm automatisch voor je kan updaten elke keer als een record bewerkt wordt, en dat je bij het maken van een record eenvoudigweg NOW() als waarde kan gebruiken zodat je je ook geen zorgen hoeft te maken over stringformaat :)

Voor een CMS waar ik mee bezig ben (Linkje - let wel, alpha-fase ;)) op het moment gebruik ik in ieder geval timestamp, en sla ik alle relevante info van een bestand op in m'n database. Het bestand zelf hernoem ik en krijgt als bestandsnaam enkel een nummer. Vervolgens gebruik ik mod_rewrite om requests naar /blaat/bestand.txt om te schrijven en het bestand terug te geven - dit alles met als netto resultaat dat ik elk mogelijk type bestand kan accepteren zonder me ooit zorgen te hoeven maken over de veiligheid ervan en dat ik zeer simpel kan zoeken naar een bestand met bepaalde grootte, mime-type, etc, en meerdere versies van hetzelfde bestand naast elkaar kan bewaren.

Mocht je zelf nog wat meer gaan doen met fileupload zou je ook eens naar deze pear package kunnen kijken, hij bevalt me wel :)

Ow, en wbt 1e dag van de maand: jou script zal elk bestand direct verwijderen de eerste twee dagen van elke maand. In plaats van dit:
PHP:
1
elseif ($datum_maand2 < $datum_maand1){

Moet je dit doen:
PHP:
1
elseif ($datum_maand2 < $datum_maand1 && $datum_dag1 > 0){


Alhoewel, om heel eerlijk te zijn, die hele ifelse lus ziet er rampzalig uit :X Hij werkt zoals jij wil al als je'm vervangt hiermee:
PHP:
1
2
3
4
if($datum_dag1) {
  if(($datum_maand2 < $datum_maand1) || ($datum_dag2 < $datum_dag1))
    unlink($filename);
}

Kan nog wel netter en korter trouwens, maar 't is laat en een lange dag geweest voor me ;)

Rekenen met datums is het naarste, vervelendste, irritantste wat je kan doen, zodat je ongeveer -altijd- beter de datumfuncties van je taal kan gebruiken. DateStr voor C(++), date / mktime voor PHP, ADD_DATE / NOW etc voor SQL, just to name a few. Als je aan het programmeren bent en je komt tot de ontdekking dat je zelf met maanden etc zit te rekenen moet je je eigenlijk altijd achter de oren krabben of je niet het wiel opnieuw aan het uitvinden bent :)

[ Voor 28% gewijzigd door FragFrog op 10-03-2007 00:46 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

Verwijderd

Als je die datum prefix in 'yyyy-mm-dd' formaat (of 'Ymd') houdt, is daar heel makkelijk op te sorteren, en kun je simpel alles dat kleiner is dan een bepaalde datum verwijderen. Ik zou in dit geval niet zo gauw naar een database grijpen...
Pagina: 1