[PHP] ftp_get geeft RETR error

Pagina: 1
Acties:
  • 366 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Oceria
  • Registratie: Juli 2001
  • Laatst online: 23:57

Oceria

I've been in between....

Topicstarter
Beste GoTers,
Ik ben niet zo'n beste php scripter en het kan dus goed zijn dat ik een simpele, stomme fout heb gemaakt, maar ik hoop dat jullie mij toch verder willen helpen.
Ik heb een php site draaien met een ftp server er achter waar ik word, powerpoint, pdf en fotobestanden op serveer. Deze files deel ik nu met m'n medestudenten door de bestanden via een internet pagina aan te bieden. Voor het downloaden van de bestanden heb ik tot nu toe altijd de ftp_wrapper gebruikt (ftp://user:pass@host:port/path/to/file), maar ik vind het vervelend dat alle gegevens zo op straat worden gegooid. Bovendien openen de meeste browsers de plaatjes in het venster, ipv dat ze gedownload worden.
Ik heb de wrapper dus vervangen door een link naar een php pagina (welke uiteindelijk een zonder html & body tags moet worden, zodat hij nooit in de browser wordt geopend) welke de bestanden middels ftp_get op de client moet zetten. Dit is wat ik ervan heb gemaakt:
code:
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
29
30
31
32
33
34
35
36
html><body>
<?php
/*
 url to be used
get.php?&jaar=&blok=&file=
*/

// Set variables
$host = "10.0.0.100";
$port = "21";
$user = "user";
$pass = "password";

// Get variables
$jaar = $_GET["jaar"];
$blok = $_GET["blok"];
$file = $_GET["file"];

// Combined variables
$local_file ="$file";
$serv_File = "downloads/students/$jaar/$blok/$file";

/* ftp_connect && ftp_login contructie (functioneert naar behoren) */

// Download file
if (ftp_get($connect, $local_file, $serv_file, FTP_ASCII)){
echo "Saving $file to $local_file...";
}else{
echo "Click here if your download does not start immediately<br />
<a href='ftp://user:password@ocs.pointclark.net:21/downloads/students/$jaar/$blok/$file'>$file</a>";
}

// Close the connection
ftp_close($connect);
?>
</body></html>
De pagina doet in principe wat ik wil (de fallback ftp_wrapper geeft de juiste link door, dus alle variabelen worden goed doorgegeven), maar op de ftp_get constructie loopt het vast:
Warning: ftp_get: 'RETR' not understood in /var/www/html/get.php on line 30
Click here if your download does not start immediately
urlnaarfile
regel 30 is
code:
1
if (ftp_get($connect, $local_file, $serv_file, FTP_ASCII)){

Ik kan de file wel downloaden met de fallback link. De pagina maakt correct contact met de FTP server, de server is pasv enabled en retr staat expliciet als toegestaan in proftpd.conf. Downloaden van de files middels flashfxp is ook gewoon mogelijk
RETR Blah.doc
150 Opening BINARY mode data connection for Blah.doc (31337 bytes)
.
Ik heb ook FTP_BINARY gebruikt, maar dat geeft precies de zelfde foutmelding.
Verdere info:
Apache/php versie is "Apache/2.0.40 (Red Hat Linux) mod_perl/1.99_07-dev Perl/v5.8.0 PHP/4.2.2 mod_ssl/2.0.40 OpenSSL/0.9.7a DAV/2"
proftp versie is 1.2.8p
De server zit achter een Thomson 510i (nat), porten 80, ftp en een pasvftp range worden naar de server geforward, de server heeft intern ip 10.0.0.x (statisch) en draait geen firewall.
Mijn vragen zijn:
wat betekent die foutmelding precies, waar zit de fout (bij de ftp configuratie, bij apache, in mijn php code, in mijn hoofd ;) ) en wat zouden jullie proberen?

Alvast bedankt voor alle sugesties! :)

Oceria doesn't know where this repeatbutton -repeatbutton is...


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Wat je nu hebt gepost is volgens mij in orde, dus het lijkt erop dat het probleem toch in de connectie zit. Kun je die niet ook even posten? En je moet sowieso binary gebruiken, zoals je FTP client zo te zien ook al doet. ;)

'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!

  • Oceria
  • Registratie: Juli 2001
  • Laatst online: 23:57

Oceria

I've been in between....

Topicstarter
*wow* Bedankt voor je snelle reactie! :)
hier de logs mbt de ftp server:
messages:
Jun 1 16:12:24 host proftpd[11220]: host.ocs.pointclark.net (10.0.0.100[10.0.0.100]) - FTP session opened.
Jun 1 16:12:24 host PAM_pwdb[11220]: (ftp) session opened for user uni by (uid=0)
Jun 1 16:12:24 host proftpd[11220]: host.ocs.pointclark.net (10.0.0.100[10.0.0.100]) - FTP session closed.
xferlog:
*niets*

/httpd/error.log
niets

acces_log:
xxx.xxx.xxx.xxx - - [01/Jun/2004:16:12:24 +0200] "GET /get.php?&jaar=Jaar%202&blok=Blok%202.7&file=2.7-11.doc HTTP/1.1" 200 316 "http://ocs.pointclark.net/blok.php?&jaar=Jaar 2&blok=Blok 2.7" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
Als ik in de get.php pagina echter ocs.pointclark.net of mijn daadwerkelijke IP neerzet kan de site echter geen contact maken:
Warning: php_hostconnect: connect failed in /var/www/html/get.php on line 24
can't connect to *mijn ip*
code:
1
$connect = ftp_connect($host, $port) or die ("can't connect to $host");
Er is behalve in de acces_log (precies het zelfde als hierboven natuurlijk) van httpd niets te vinden.
Het lijkt er inderdaad op dat de connectie via de httpd naar de ftp server niet lukt ((10.0.0.100[10.0.0.100])), maar hoe kan ik de server vertellen naar welke site het gestuurd moet worden?

Oceria doesn't know where this repeatbutton -repeatbutton is...


Acties:
  • 0 Henk 'm!

  • Cavalera125
  • Registratie: December 2003
  • Laatst online: 21-09 11:15
Vergeet je niet in te loggen?

PHP:
1
   $loginResult = ftp_login($connect, "username", "pass");

En dan dus ook ff checken of de login succesvol was.

edit:

/* ftp_connect && ftp_login contructie (functioneert naar behoren) */

Sorry niet goed gelezen...

[ Voor 33% gewijzigd door Cavalera125 op 01-06-2004 17:26 ]


Acties:
  • 0 Henk 'm!

  • Oceria
  • Registratie: Juli 2001
  • Laatst online: 23:57

Oceria

I've been in between....

Topicstarter
Cavalera, die code had ik eruit gelaten om het korter te maken, het inloggen gaat prima:
code:
1
2
3
4
5
6
7
8
9
// Connect to server
$connect = ftp_connect($host, $port) or die ("can't connect to $host");

// Login
$login = ftp_login($connect, $user, $pass)or die ("could not login as $user");

// Download file
if (ftp_get($connect, $local_file, $serv_file, FTP_BINARY)){
echo "Saving $file to $local_file...";


Ondertussen ben ik ietsje verder. Zoals ik al vreesde is een deel van het probleem mijn eigen stommiteit:
als je $serv_File doet en later alleen naar $serv_file vraagt, dan gaat het niet werken ;)
Nu ik dit opgelost heb is de foutmelding inderdaad veranderd:
Warning: ftp_get(): error opening AKWO 1.1.doc in /var/www/html/get.php on line 30
Hier is al eens over geschreven op het forum, dus daar ga ik nog even naar op zoek.
iig bedankt voor jullie commentaar alvast!

Oceria doesn't know where this repeatbutton -repeatbutton is...


Acties:
  • 0 Henk 'm!

  • Cavalera125
  • Registratie: December 2003
  • Laatst online: 21-09 11:15
Van php.net:
The file transferred will be saved in the folder where the ftp_get function is executed.
So, you will need the write permission in that folder.

In other way, you will obtain a "can´t open local file" error.
http://nl2.php.net/manual/en/function.ftp-get.php

Acties:
  • 0 Henk 'm!

  • Oceria
  • Registratie: Juli 2001
  • Laatst online: 23:57

Oceria

I've been in between....

Topicstarter
Dus dat betekent dat de file locaal op de server opgeslagen wordt ipv op de client computer.
Welke methode moet ik dan gebruiken om een file van de ftp server naar de webclient te sturen, via apache?

Oceria doesn't know where this repeatbutton -repeatbutton is...


Acties:
  • 0 Henk 'm!

  • MaxxRide
  • Registratie: April 2000
  • Laatst online: 22-06 16:52

MaxxRide

Surf's up

Lijkt me dat je de file "gewoon" op moet sturen :?

Je laat het php script een linkje (of direct via write functie, details weet ik niet) naar de files op de server wijzen. Hiermee zijn ze dan te downen

Wat je nu doet is als het ware een ftp server maken die files van een ftp-server op de webserver plaatst, dus niet op de hdd van de client. Hiervoor zou ik als ik jou wat het script de file laten returen (ik weet dus niet precies hoe je dat doet, ff in de php dox kijken lijkt me).

[ Voor 2% gewijzigd door MaxxRide op 01-06-2004 21:15 . Reden: MSN emoticon i.p.v. tweakers emoticn 8)7 ]

If you are not wiping out you are nog pushing enough...


Acties:
  • 0 Henk 'm!

  • Oceria
  • Registratie: Juli 2001
  • Laatst online: 23:57

Oceria

I've been in between....

Topicstarter
@ Pinda, ja, dat is de ftp_wrapper functie. En zoals ik in de openings post liet weten wil ik dat juist niet, omdat dan alle inlog gegevens gewoon als html worden verstuurd.
code:
1
ftp://user:pass@host:port/file
werkt dus prima, maar ik wil "user:pass@host:port" onzichtbaar maken.
Dus meer als
login.php
code:
1
ftp_connect && ftp_login

en
downloadpagina.php
code:
1
$get filename include(login.php) <a href=ftp://$filename /> && ftp_close

Of misschien get.php met een a href naar de server, welke verplicht geklikt word, een sort redirect. Maar dan nog zit ik met het probleem dat sommige dingen geopend worden in de browser van de client, ipv dat ze naar de harde schijf worden opgeslagen.
iig weer bedankt voor het meedenken! :)

[ Voor 6% gewijzigd door Oceria op 01-06-2004 21:47 ]

Oceria doesn't know where this repeatbutton -repeatbutton is...


Acties:
  • 0 Henk 'm!

  • Oceria
  • Registratie: Juli 2001
  • Laatst online: 23:57

Oceria

I've been in between....

Topicstarter
Even een update hierop. Ik heb ondertussen fget verlaten, omdat dat alleen download naar de webserver, en ik wil downloaden naar de webclient, via FTP.
Ik heb get.php herschreven naar dit:
code:
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
29
30
31
32
33
34
35
36
37
38
<?php
// Basic information needed
$host = "xxx.xxx.xxx.xxx";  // internal IP
$fbhost = "xxx.xxx.xxx.xxx";    // external IP
$port = "xx";
$user = "user";
$pass = "pass";

// Retrieve information from url
$jaar = $_GET["jaar"];
$blok = $_GET["blok"];
$file = $_GET["file"];

// Combine forces
$path = ("/downloads/students/$jaar/$blok/$file");

// Set up the connection
$connect = ftp_connect($host,$port);

// Login
$login = ftp_login($connect, $user, $pass);

// Create a ftpwrapper so download can proceed if fopen fails
$fall_back = "<html><body>Klik hier als de download niet start:<br />
    <a href='ftp://$user:$pass@$fbhost:$port$path'>$file</a></body></html>";

// Check the connection and open file, or fall back to the ftpwrapper
if ((!$connect) || (!$login)) {
exit ($fall_back);
} else {
$f=fopen("ftp://$host:$port$path", "rw")or die($fallback);
}


// Close the connection
fclose($f);
ftp_close($connect);
?>

Helaas werkt dit ook niet naar behoren:
Warning: fopen("ftp://intern.ip.van.host:port/downloads/students/Jaar 1/correct blok/correcte.file", "rw") - Bewerking nu in uitvoering in /var/www/html/get.php on line 30
Ik heb het geloof ik echt nog niet door. Weet iemand wat ik nu fout doe? Als ik voor fopen ook de outside IP gebruikt opent de pagina helemaal niet.
Gaat deze constructie überhaupt wel werken? Of kan ik beter gewoon opgeven en de ftpwrapper gebruiken?
TIA weer voor iedereen die er even naar wil kijken!

Oceria doesn't know where this repeatbutton -repeatbutton is...

Pagina: 1