[PHP] Dir of file via FTP op Windows Server

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben een eigen CMS aan het schrijven voor klanten van mijn ontwerp- en hostingbedrijfje, met het oogpunt op simpelheid.

Hiervoor moet ik op een bepaald ogenblik remote (over FTP) checken of een bepaald item in een map een submap of een file is. Onder linux werkte de code (van de help-pagina's op php.net) gewoon als ik het me goed herinner, maar windows server lijkt problemen te geven.

PHP:
760
761
762
763
764
765
766
767
768
769
// Controleren of item een dir of file is via FTP
function ftp_is_dir($dir) {
  global $ftp_conn;
  if (ftp_chdir($ftp_conn, basename($dir))) {
    ftp_chdir($ftp_conn, '..');
    return true;
  } else {
    return false;
  }
}


$dir wordt weldegelijk correct gepassed (gecontroleerd met echo's). In plaats van in het geval van een return false terug te krijgen, krijg ik de foutmelding
Warning: ftp_chdir() expects parameter 1 to be resource, null given in C:\xampp\htdocs\cms\cms_backend\functions.php on line 763
Heeft iemand een idee hoe dit probleem eventueel opgelost zou kunnen worden? Bij voorbaat dank :)

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 10:43

Matis

Rubber Rocket

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
<?php
// set up basic connection
$conn_id = ftp_connect($ftp_server); 

// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); 

// check connection
if ((!$conn_id) || (!$login_result)) {
    die("FTP connection has failed !");
}

echo "Current directory: " . ftp_pwd($conn_id) . "\n";

// try to change the directory to somedir
if (ftp_chdir($conn_id, "somedir")) {
    echo "Current directory is now: " . ftp_pwd($conn_id) . "\n";
} else { 
    echo "Couldn't change directory\n";
}

// close the connection
ftp_close($conn_id);
?>


je hebt toch nergens $ftp_connect gevuld, die is null. Daar valt ie (terecht) over!

[ Voor 57% gewijzigd door Matis op 16-05-2009 11:21 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

Verwijderd

toaomatis schreef op zaterdag 16 mei 2009 @ 11:20:

je hebt toch nergens $ftp_connect gevuld, die is null. Daar valt ie (terecht) over!
Je kunt toch ook wel zien dat die $ftp_connect in zijn code snippet een globale variabele is?

Wat er waarschijnlijk misgaat is dat het verbinden met de FTP server niet zonder problemen gaat, of dat ergens tussendoor de verbinding is gesloten.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op zaterdag 16 mei 2009 @ 11:29:
[...]

Je kunt toch ook wel zien dat die $ftp_connect in zijn code snippet een globale variabele is?

Wat er waarschijnlijk misgaat is dat het verbinden met de FTP server niet zonder problemen gaat, of dat ergens tussendoor de verbinding is gesloten.
met de verbinding is volgens niets mis, want ik heb al enkele echo's gedaan binnen deze functie en die gaven allemaal geen probeem aan.

Voor de duidelijkheid nog even de snippet waar deze functie aangeroepen wordt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Verbinden met FTP-server
$ftp_conn = ftp_connect($ftpdata['ftp_host'], $ftpdata['ftp_port']);
$ftp_login_result = ftp_login($ftp_conn, $ftpdata['ftp_user'], $ftpdata['ftp_pass']);
if(!$ftp_conn || !$ftp_login_result) {
    die('FTP data retrieved, but connection failed');
}
// turn passive mode on
ftp_pasv($ftp_conn, true);

ftp_chdir($ftp_conn, $ftpdata['ftp_dir']);
putenv('TMPDIR=/tmp/');
$contents = ftp_nlist($ftp_conn, ".");
$ftp_nlist = ftp_nlist($ftp_conn, ".");
sort($ftp_nlist); //alphabetical sorting
foreach ($ftp_nlist as $v) {
  if (!ftp_is_dir($v)) {
      echo "<div class=\"image\"><a href=\"http://" . $_COOKIE['user_name'] . "/" . $ftpdata['ftp_dir_http'] . $v . "\"><img src=\"http://" . $_COOKIE['user_name'] . "/" . $ftpdata['ftp_dir_http'] . $image['thumb_prefix'] . $v . "\" /></a><br />[ <a href=\"rmimage.php?url=" . $v . "\">Delete</a> ]</div>";
  }
}

(zorgt ervoor dat een overzicht van de afbeeldingen in die bepaalde map weergeven worden, zonder eventuele directories)

Acties:
  • 0 Henk 'm!

Verwijderd

$ftp_connect is iets anders dan $ftp_conn

Weer een prachtig voorbeeld van waarom je geen globals zou moeten gebruiken. Waarom geef je die resource niet als parameter mee aan die functie?

[ Voor 64% gewijzigd door Verwijderd op 16-05-2009 11:46 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op zaterdag 16 mei 2009 @ 11:45:
$ftp_connect is iets anders dan $ftp_conn

Weer een prachtig voorbeeld van waarom je geen globals zou moeten gebruiken. Waarom geef je die resource niet als parameter mee aan die functie?
viel me ook net op. aangepast, en het filteren van de images lijkt nu in orde, maar nog niet alles is van de baan :|

error (wordt verschillende keren herhaald bij elke afbeelding):
Warning: ftp_chdir() [function.ftp-chdir]: CWD failed. "button1.gif" : no such file or directory. in C:\xampp\htdocs\cms\cms_backend\functions.php on line 763

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Verwijderd schreef op zaterdag 16 mei 2009 @ 11:52:
[...]


viel me ook net op. aangepast, en het filteren van de images lijkt nu in orde, maar nog niet alles is van de baan :|

error (wordt verschillende keren herhaald bij elke afbeelding):

[...]
Dan moet je ervoor zorgen dat er niet geCWD'd wordt naar bestanden, alleen naar directories hè ;)

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


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 10:43

Matis

Rubber Rocket

Verwijderd schreef op zaterdag 16 mei 2009 @ 11:52:
[...]


viel me ook net op. aangepast, en het filteren van de images lijkt nu in orde, maar nog niet alles is van de baan :|

error (wordt verschillende keren herhaald bij elke afbeelding):

[...]
Op wat voor platform draait die ftp server? Als het een Linux doos is moet je goed op de HoOfdLetTerS.GiF letten!

Edit: Ik zie net Windows Server |:( |:( |:(

Edit 2:

PHP:
1
2
3
if (!ftp_is_dir($v)) {
      echo "<div class=\"image\"><a href=\"http://" . $_COOKIE['user_name'] . "/" . $ftpdata['ftp_dir_http'] . $v . "\"><img src=\"http://" . $_COOKIE['user_name'] . "/" . $ftpdata['ftp_dir_http'] . $image['thumb_prefix'] . $v . "\" /></a><br />[ <a href=\"rmimage.php?url=" . $v . "\">Delete</a> ]</div>";
  }


Persoonlijk zal ik hier voor printf gaan of sprintf en dan die string returnen. Ook zal ik je string maken met single quote's zodat je de " niet hoeft te escapen, dan is de kans ook kleiner op fouten in die regels, alsmede te veel of te weinig .jes tussen de string als concat!

[ Voor 45% gewijzigd door Matis op 16-05-2009 12:11 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
CodeCaster schreef op zaterdag 16 mei 2009 @ 12:07:
[...]

Dan moet je ervoor zorgen dat er niet geCWD'd wordt naar bestanden, alleen naar directories hè ;)
met die CWD --> lukt deze, dir, lukt deze niet, file. dus CWD checkt het script sowieso, zowel op files en dirs omdat het nog niet bekend is wat het is. Ik heb gewoon een @ voor de functieaanroep ftp_chdir() geplaatst zodat errors onderdrukt worden en nu lijkt het perfect te zijn.

Bedankt voor de hulp, alles lijkt door een aantal simpele foutjes veroorzaakt te worden, daar kwam ik na enkele uren nog niet uit 8)7

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 10:43

Matis

Rubber Rocket

Verwijderd schreef op zaterdag 16 mei 2009 @ 12:12:
[...]


met die CWD --> lukt deze, dir, lukt deze niet, file. dus CWD checkt het script sowieso, zowel op files en dirs omdat het nog niet bekend is wat het is. Ik heb gewoon een @ voor de functieaanroep ftp_chdir() geplaatst zodat errors onderdrukt worden en nu lijkt het perfect te zijn.
Sorry voor de mogelijke flame, maar dat is echt TE ranzig. Je doet of een try catch blok inbouwen OF je checkt of je parameters valide zijn (wat overigens altijd moet kloppen (programming by design)).

Een @ voor de functie is IMO not done!

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
toaomatis schreef op zaterdag 16 mei 2009 @ 12:15:
[...]


Sorry voor de mogelijke flame, maar dat is echt TE ranzig. Je doet of een try catch blok inbouwen OF je checkt of je parameters valide zijn (wat overigens altijd moet kloppen (programming by design)).

Een @ voor de functie is IMO not done!
volgens mij (en volgens, zover ik weet, google), is er niet echt een alternatief voor deze methode? Zelf vindt ik het ook erg omslachtig ja, dus als op een nettere manier het zelfde te bereiken is hoor ik het uiteraard graag!

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 10:43

Matis

Rubber Rocket

Verwijderd schreef op zaterdag 16 mei 2009 @ 12:20:
[...]

volgens mij (en volgens, zover ik weet, google), is er niet echt een alternatief voor deze methode? Zelf vindt ik het ook erg omslachtig ja, dus als op een nettere manier het zelfde te bereiken is hoor ik het uiteraard graag!
Je kunt beter kijken of er folders in de huidige folder zit. Dan kun je checken of je folder die je in wilt in het lijstje staat met folders die je ophaalt vanaf de server. Als dat ja is dan kun je ftp_chdir() proberen, anders moet je returnen dat de map niet bestaat.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
toaomatis schreef op zaterdag 16 mei 2009 @ 12:30:
[...]


Je kunt beter kijken of er folders in de huidige folder zit. Dan kun je checken of je folder die je in wilt in het lijstje staat met folders die je ophaalt vanaf de server. Als dat ja is dan kun je ftp_chdir() proberen, anders moet je returnen dat de map niet bestaat.
het is net de bedoeling dat alle folders buitengesloten worden. Het probleem hier is dat er (buiten deze ftp_chdir() methode) geen manier lijkt te bestaan om over FTP te controleren of een bepaald bestand een folder is of een file, waarna alleen de files gebruikt worden.

Ik hoop dat ik goed begrijp wat je bedoelde. :)
Pagina: 1