[PHP] naam uploaded file inlezen

Pagina: 1
Acties:

  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 09:52

Pelle

🚴‍♂️

Topicstarter
Om het uploaden van files wat makkelijker te maken heb ik even een class geschreven die dat voor me regelt, zodat ik niet voor elke file die via een CMS geupload wordt een lap code aan hoef te passen.

Ik loop alleen tegen een probleempje aan; het is vast erg makkelijk maar ik kom er niet uit :(

Dit is m'n class:
PHP:
1
<?    class uploadedFileHandler {        function uploadedFileHandler() {            srand((double) microtime() * 1000000);         }        function handleUpload($filename, $path) {            $this->destinationPath  = $path;            $this->originalName     = $HTTP_POST_FILES[$filename]["name"];            $this->randomNumber     = rand(100000,999999);            $this->destinationName  = $this->randomNumber . $this->originalName;            if (is_uploaded_file($filename)) {                copy($filename, $this->destinationPath . $this->destinationName);                return $this->destinationName;            } else {                    $this->destinationName  = "";                    return $this->destinationName;            }        }    }?>

Het probleem is dat m'n filenames alleen het random nummer als destination name krijgen. Logisch, want dit -ervanuitgaande dat dat m'n <input type="file"> de naam 'pauper' heeft-:
code:
1
$HTTP_POST_FILES[$filename]["name"]

..is niet hetzelfde als dit
code:
1
$HTTP_POST_FILES["pauper"]["name"];

Hoe ga ik dit oplossen? Ik zie het niet :(

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 27-08 13:53

chem

Reist de wereld rond

ik zou de sub-array http_post_files[$file] doorgeven aan de constructor van de class
je kan dan met $this->file['...'] alle eigenschappen uitlezen.

cq. geef gewoon alles door aan je class, en ga niet binnen de class met globals werken...

Klaar voor een nieuwe uitdaging.


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

  1. Ik zou als bestandsnaam een md5 van de content + evt. datum van het bestand nemen
  2. $HTTP_POST_FILES moet volgens mij geglobalized worden, bovenaan in de methode handleUpload [sub]welke ik overigens gewoon handle zou noemen. Dat het om een upload gaat staat al in de naam van de class[/sub] [code]function handle ( $filename, $path ) { global $HTTP_POST_FILES; // ... }[/code] [sub][edit][/sub] chem's oplossing is wdb idd beter [sup][/edit][/sup]
  3. Je moet eigenlijk je class-properties bovenaan je class-definition definieren:
    code:
    1
    2
    3
    4
    5
    
    class C
    {
       var prop1,
         prop2;
    }

    Doe maar eens error_reporting ( E_ALL ) aan ;)
HTH :?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Grum
  • Registratie: Juni 2001
  • Niet online
* Grum gilt het uit van plezier :D

drm: Ik zou als bestandsnaam een md5 van de content + evt. datum van het bestand nemen

wat een wijsheid :+

* Grum is ook enorm PRO md5 hashes van een file voor de filename.

Nooit dubbele files, nooit gezeik met uniekheid.

toen ik 'srand' zag staan dacht ik meteen - even verhaaltje over md5 en filenames posten. MAAR HET HOEFT NIET MEER!

* Grum is gelukkig :+

  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 09:52

Pelle

🚴‍♂️

Topicstarter
Op woensdag 13 maart 2002 11:37 schreef chem het volgende:
ik zou de sub-array http_post_files[$file] doorgeven aan de constructor van de class
je kan dan met $this->file['...'] alle eigenschappen uitlezen.

cq. geef gewoon alles door aan je class, en ga niet binnen de class met globals werken...
Ok, ik heb nu dit:
PHP:
1
<?    class uploadedFileHandler {        function uploadedFileHandler() {            srand((double) microtime() * 1000000);         }        function handleUpload($file, $path) {            $this->file             = $file;            $this->destinationPath  = $path;            $this->originalName     = $this->file["name"];            $this->randomNumber     = rand(100000,999999);            $this->destinationName  = $this->randomNumber . $this->originalName;            if (is_uploaded_file($this->file)) {                copy($this->file, $this->destinationPath . $this->destinationName);                return $this->destinationName;            } else {                $this->destinationName  = "";                return $this->destinationName;            }        }    }?>

Ik roep 'm zo aan:
code:
1
$dude = new uploadedFileHandler();

en zo kijk ik of het gelukt is:
code:
1
print $dude->handleUpload($HTTP_POST_FILES["pauper"], "/www/virtual/enzovoorts/blaat/")

Maar dat is dus niet zo, die functie returned niks en ook in die directory staat geen geupload bestand.

De filename kan ik nu wel uitlezen, dus dat werkt ($dude->originalName geeft gewoon 'test.gif'). Maar nu is $this->file geen uploaded file meer, en dus wordt er niks gekopieerd.

  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 09:52

Pelle

🚴‍♂️

Topicstarter
Op woensdag 13 maart 2002 11:38 schreef drm het volgende:
Ik zou als bestandsnaam een md5 van de content + evt. datum van het bestand nemen
Ik niet :)
Heb daar wel aan zitten denken, maar een grote klant wil dat wanneer iemand een uploaded file weer download van hun site, dat ze aan de filename zelf kunnen zien wat erin zit. En dat is niet zo met een vage md5 hash :)
$HTTP_POST_FILES moet volgens mij geglobalized worden, bovenaan in de methode handleUpload
Hoeft niet, zonder een global werkte het ook, afgezien van het uitlezen van de filename dan.
welke ik overigens gewoon handle zou noemen. Dat het om een upload gaat staat al in de naam van de class
Sja, volgens mij hebben wij het wel eens gehad over mijn naamgeving :)
Je moet eigenlijk je class-properties bovenaan je class-definition definieren:
Hoe bedoel je? En die error-reporting blijft lekker uit. Wat niet weet, dat niet deert :X ;)

  • Grum
  • Registratie: Juni 2001
  • Niet online
Je kan met de headers forcen dat je pc het ziet als een bestand met een bepaalde naam.

  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 09:52

Pelle

🚴‍♂️

Topicstarter
Op woensdag 13 maart 2002 11:59 schreef Grum het volgende:
Je kan met de headers forcen dat je pc het ziet als een bestand met een bepaalde naam.
Daar heb je helemaal gelijk in, 't is alleen net een tikkeltje omslachtiger.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Pelle:
Ik niet :)
Heb daar wel aan zitten denken, maar een grote klant wil dat wanneer iemand een uploaded file weer download van hun site, dat ze aan de filename zelf kunnen zien wat erin zit. En dat is niet zo met een vage md5 hash :)
da's voor de front-end, niet voor de back-end ;)
Pelle:
Hoeft niet, zonder een global werkte het ook, afgezien van het uitlezen van de filename dan.
hmm, zal wel met je configuratie te maken hebben, dan.
Naja, sowieso zou ik voor chem's nette oplossing gaan.
Pelle:
Sja, volgens mij hebben wij het wel eens gehad over mijn naamgeving :)
:X
Pelle:
Hoe bedoel je? En die error-reporting blijft lekker uit. Wat niet weet, dat niet deert :X ;)
* drm wacht op * Grum :D :+
Pelle:
Ok, ik heb nu dit:
PHP:
1
<?door topix verneukte meuk?>

Ik roep 'm zo aan:
code:
1
$dude = new uploadedFileHandler();

en zo kijk ik of het gelukt is:
code:
1
2
print $dude->handleUpload($HTTP_POST_FILES["pauper"], 
    "/www/virtual/enzovoorts/blaat/")

Maar dat is dus niet zo, die functie returned niks en ook in die directory staat geen geupload bestand.

De filename kan ik nu wel uitlezen, dus dat werkt ($dude->originalName geeft gewoon 'test.gif'). Maar nu is $this->file geen uploaded file meer, en dus wordt er niks gekopieerd.
Wat als je $file als reference meegeeeft?
code:
1
function handleUpload_OfEenAnderePauperPelleNaam ( &$file, $path) {

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • chem
  • Registratie: Oktober 2000
  • Laatst online: 27-08 13:53

chem

Reist de wereld rond

Op woensdag 13 maart 2002 11:53 schreef Pelle het volgende:

[..]

Ok, ik heb nu dit:

Ik roep 'm zo aan:
code:
1
$dude = new uploadedFileHandler();

en zo kijk ik of het gelukt is:
code:
1
print $dude->handleUpload($HTTP_POST_FILES["pauper"], "/www/virtual/enzovoorts/blaat/")

Maar dat is dus niet zo, die functie returned niks en ook in die directory staat geen geupload bestand.

De filename kan ik nu wel uitlezen, dus dat werkt ($dude->originalName geeft gewoon 'test.gif'). Maar nu is $this->file geen uploaded file meer, en dus wordt er niks gekopieerd.
PHP:
1
<?copy($this->file['tmp_name'], $this->destinationPath . $this->destinationName);?>

zou ik dan ook doen...

doe verder eens een print_r($dude), dat zou wat debugging info moeten geven

Klaar voor een nieuwe uitdaging.


  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 09:52

Pelle

🚴‍♂️

Topicstarter
Op woensdag 13 maart 2002 12:04 schreef drm het volgende:
Wat als je $file als reference meegeeeft?
Haalt niks uit.
code:
1
handleUpload_OfEenAnderePauperPelleNaam

STFU :X
Op woensdag 13 maart 2002 12:06 schreef chem het volgende:
PHP:
1
<?copy($this->file['tmp_name'], $this->destinationPath . $this->destinationName);?>

zou ik dan ook doen...
Was ik inmiddels zelf ook achter, maar dat gaf een permission denied error. Erg raar, aangezien die directory gewoon alle rechten goed had staan.

Inmiddels maar even een noodoplossing gebouwd, die prima werkt maar natuurlijk absoluut niet netjes is:
PHP:
1
<?    class uploadedFileHandler {        function uploadedFileHandler() {            srand((double) microtime() * 1000000);         }        function handleUpload($file, $filename, $path) {             $this->destinationPath  = $path;            $this->originalName     = $filename;            $this->randomNumber     = rand(100000,999999);            $this->destinationName  = $this->randomNumber . $this->originalName;            if (is_uploaded_file($file)) {                copy($file, $this->destinationPath . $this->destinationName);                return $this->destinationName;            } else {                $this->destinationName  = "";                return $this->destinationName;            }        }    }$dude = new uploadedFileHandler();$gelukt = $dude->handleUpload($pauper, $HTTP_POST_FILES["pauper"]["name"], "/www/virtual/enzovoorts/blaat/");?>

Zal binnenkort -als de deadlinedruk weg is- eens kijken of ik 'm helemaal naar m'n zin kan krijgen. Thnks iig :)
Pagina: 1