[PHP] Een file van een andere server doorgeven

Pagina: 1
Acties:

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Topicstarter
Aangezien ik op mijn werk achter een firewall zit en toch graag wil FTP'en ben ik bezig met een FTP applicatie op mijn eigen apache (1.3.27)/ PHP (4.2.3) server.. Nu zijn er al meerdere mensen die dit gedaan hebben; alleen hebben zijn allen een beperking die ik wil omzeilen. Het is namelijk zo dat alle scripts die ik tot nu toe heb gezien (hotscripts.com/php.net/sourceforge.net) alle bestanden die ge-upload of gedownload worden eerst lokaal opslaan. Dus het uploaden van een bestand gaat van mijn computer naar mijn server die het vervolgens upload naar de FTP; voor downloaden geld het omgekeerde uiteraardt. Dat betekent dat als ik een file van 500 Mb wil downloaden dat ik eerst moet wachten tot mijn server hem binnen heeft (waarbij 'ie overigens al z'n maximale executietijd heeft overtreden) voordat mijn server hem naar mij toe stuurt.

Dit kan natuurlijk beter. Als ik dit:
PHP:
1
2
3
4
5
6
$fp = @fopen("ftp://".$_SESSION['doLogin_userName'].":".$_SESSION["doLogin_passWord"].
"@".$_SESSION["doLogin_hostName"].$downloadFile_fileName,"r");
if ($fp)
{ print"The file exists"; }
else
{ print"The file does not exist"; }

doe dan krijg ik netjes "The file exists", maar deze stream kan ik niet direct naar de browser sturen? Als ik een readfile gebruik dan krijg ik een download aangeboden met de volgende tekst:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<br />
<b>Warning</b>:  stat failed for ftp://Spider.007:******@**.**.***.***/ (errno=2 - 
No such file or directory) in <b>d:\http_root\webftp\test.php</b> on line <b>42</b><br />
<br />
<b>Warning</b>:  Cannot add header information - headers already sent by (output 
started at d:\http_root\webftp\test.php:42) in <b>d:\http_root\webftp\test.php</b> on
 line <b>42</b><br />
<br />
<b>Warning</b>:  Cannot add header information - headers already sent by (output 
started at d:\http_root\webftp\test.php:42) in <b>d:\http_root\webftp\test.php</b> on
 line <b>43</b><br />
<br />
<b>Warning</b>:  php_hostconnect: connect failed in 
<b>d:\http_root\webftp\test.php</b> on line <b>44</b><br />
<br />
<b>Warning</b>:  readfile("ftp://...@**.**.***.***/") - Bad file descriptor in 
<b>d:\http_root\webftp\test.php</b> on line <b>44</b><br />


dus dat werkt ook niet helemaal lekker... Iemand een manier om de fopen stream direct aan te bieden aan de downloader; of een manier om de errors hierboven op te lossen?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 22-08 16:45
En als je een proxy (socks4 of 5 op port 80) gaat draaien op je eigen machine en dan in je ftpclient die proxy instelt?
(waarbij 'ie overigens al z'n maximale executietijd heeft overtreden)
Die kan je veranderen in je script.

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Topicstarter
Sjaaky schreef op 16 oktober 2002 @ 21:03:
En als je een proxy (socks4 of 5 op port 80) gaat draaien op je eigen machine en dan in je ftpclient die proxy instelt?

[...]
is dat niet een beetje omslachtig? Wat denk je dat precies het nut van een proxy zou zijn :?
Die kan je veranderen in je script.
Dat weet ik. ;)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 22-08 16:45
Het nut van de proxy is dat al je netwerkverkeer over poort 80 gaat, zodat het (neem ik aan) door de firewall heen komt. Het grote voordeel ervan is dat het volkomen transparant is en (bijna) alle programma's met een proxy overweg kunnen. Dan kan je een normale ftp-client gebruiken, ipv een webinterface ervoor, die je zelf nog in elkaar wilt gaan klussen.
Afgezien van het feit dat het een leuk project is, is het verstandiger om een proxy-server te downloaden en te installeren. (Wel zorgen dat alleen jij via de proxy kan werken, anders zit straks iedereen anoniem te surfen vanaf jouw compu).

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Topicstarter
ja oke; ik begrijp wat je bedoelt; maar ik zoek mijn heil toch liever in een zelfgeschreven web interface in PHP waar ik nog wat van kan leren ipv. een proxy op mijn eigen machine te installeren....

BTW was dat gedeelte "Ik zit achter een firewall" meer als achtergrond informatie bedoelt ;)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Topicstarter
*schop* Niemand een idee hoe je een server een FTP stroom data door laat geven aan een andere client?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 22-08 16:45
Ok in dat geval zou zo iets moeten werken:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
  $fp = fopen ("ftp://$url", "rb");

  if ($fp !== false) {
    header("Content-Type: application/x-octet-stream");
    header("Content-Disposition: attachment; filename=$filename");
    while($buf = fread($fp, 10240))
    {
         echo $buf;
    }
    fclose($fp);
    exit();
  }

Waarom readfile() niet werkt zou ik niet weten. Bovenstaande methode is ieder geval zuiniger met geheugen.

ps. ja dat wist ik wel, maar toen ging Got down :)

Verwijderd

Ik denk dat fpassthru wel het handigst is.

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 22-08 16:45
Zie de usercomments bij fpassthru. Hij schijnt nogal veel geheugen in te nemen. Dit heb ik niet getest en misschien was het een oudere versie van php, maar daarom deed ik het op bovenstaande manier.
Verder heb ik bij fopen even een "b" toegevoegd.

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Topicstarter
Sjaaky, bedankt, ik ga meteen ff kijken of die code van jou te gebruiken is! Ik post iig nog even of en hoe het gelukt is.

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Topicstarter
Ok, ik heb het even geprobeerd; als ik fpassthru gebruik dan wordt de content van de file:
code:
1
2
<b>Warning</b>:  fclose(): 2 is not a valid File-Handle resource in 
<b>d:\http_root\webftp\index.php</b> on line <b>231</b><br />

als ik de code van Sjaaky gebruik dan krijg ik consistent een file van 0 bytes (heb meerdere files geprobeerd).
BTW is dit de functie in zijn geheel (ik heb echt het gevoel ergens iets stoms te doen :+
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function WebFTP_downloadFile($downloadFile_fileName){
    global $theConnection;

    $localFileName = $downloadFile_fileName;

    while (strstr($localFileName, "/")) $localFileName = 
substr(strstr($localFileName, "/"), 1, strlen(strstr($localFileName, "/")));

    $fp = fopen ("ftp://".$_SESSION['doLogin_userName'].":".
$_SESSION["doLogin_passWord"]."@".$_SESSION["doLogin_hostName"].
$downloadFile_fileName, "rb");

    if ($fp != false){
        header("Content-Type: application/x-octet-stream");
        header("Content-Disposition: attachment; filename=".$localFileName);

        while($buf = fread($fp, 10240)){
             echo $buf;
        }
        fclose($fp);
        exit();
    }
}

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 22-08 16:45
Dan heb je waarschijnlijk geen rechten om het bestand te lezen. Ook al vind ik het wel vaag dat fopen dan niet failt.

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Topicstarter
ik heb nog nooit problemen gehad met de rechten; waarom zou de readfile het wel doen en fopen niet:? De rechten kloppen volgens mij dus wel; niemand een ander idee?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Topicstarter
Ik heb de aangedragen oplossingen geprobeerd; is er niemand die mij kan helpen? Hebben meer mensen dit probleem gehad?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 22-08 16:45
Probeer dit eens:
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
<?php
$url = $HTTP_GET_VARS['url'];
if (!empty($url)) {
  $path_parts = pathinfo("$url");
  $filename = $path_parts["basename"];
  $fp = fopen ($url, "rb");
  if ($fp !== false) {
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=$filename");
    while($buf = fread($fp, 10240))
    {
         echo $buf;
    }
    fclose($fp);
    exit();
  }
} else {
    $url = "ftp://ftp.debian.org/debian/README";
}
?>
<HTML>
<BODY>
<FORM method='get'>
Url:<INPUT type='text' name='url' size='40' value="<?=$url?>">
<BR><INPUT type='submit'>
</FORM>
</BODY>
</HTML>

En dan gewoon het bestand proberen te downloaden dat standaard aangegeven staat. Ik denk namelijk nog steeds dat het iets met rechten is. Kan je eigenlijk passive downloaden van die server? Daar zou het ook kunnen liggen.
Pagina: 1