[php] ftp download bestemming *

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Ik ben een ftp client aan het maken voor op een website. Alleen het downloaden wil nog niet helemaal lukken.

code:
1
2
$destination = "E:\";
$download= @ftp_get($conn, $port, $destination, $currFile, FTP_BINARY);


Dit wil hij niet pakken. Ik heb op php.net het volgende gevonden:

code:
1
2
3
If you want, you can save in any other directory in your hard disk, for example: 

ftp_get($ftpstream, "C:\somefile.exe", "somefile.exe", FTP_BINARY);


Als ik er bij mij het volgende van maak, doet hij het perfect:

code:
1
2
$destination = "ftpaccess/";
$download= @ftp_get($conn, $port, $destination, $currFile, FTP_BINARY);


Hoe maak ik hem duidelijk dat hij achter E:\ de bestandsnaam moet zetten en daar opslaat?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:44

gorgi_19

Kruimeltjes zijn weer op :9

Haal die @ er eens van te voren weg. Welke foutmelding krijg je dan?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • chem
  • Registratie: Oktober 2000
  • Laatst online: 19-09 22:18

chem

Reist de wereld rond

ik zie bij jou nog een $port, en niet bij het voorbeeld?

Klaar voor een nieuwe uitdaging.


  • WPN
  • Registratie: Augustus 2003
  • Laatst online: 24-07 21:14

WPN

en als je er E:\\ van maakt?

Als ik denk zoals ik dacht, dan doe ik zoals ik deed, als ik doe zoals ik deed, dan denk ik zoals ik dacht! Cogito Ergo Sum


Verwijderd

Topicstarter
chem schreef op 19 augustus 2004 @ 08:32:
ik zie bij jou nog een $port, en niet bij het voorbeeld?
Klopt, die staat ergens anders gedeclareerd. Het leek mij niet relevant om die er bij te zetten. Klopt die code overigens? Kan je er zo een poort achter zetten?

Ik zal thuis E:\\ eens proberen (ben nu aan het werk. Bijna laatste dag voor ik weer naar school kan 8)7)

Als er nog andere ideeen zijn hoor ik het graag.

  • Kuhlie
  • Registratie: December 2002
  • Niet online
In het voorbeeld staat behalve een directory ook een bestandsnaam gespecificeerd. Misschien moet jij dat ook doen :P

  • WPN
  • Registratie: Augustus 2003
  • Laatst online: 24-07 21:14

WPN

@Kuhlie: ik denk dat $currFile het bestand is

maar wat je ook ff kan doen is alle variabellen die je in de connectie gebruikt, even echo'n zodat je zeker weet dat alles ingevult is

Als ik denk zoals ik dacht, dan doe ik zoals ik deed, als ik doe zoals ik deed, dan denk ik zoals ik dacht! Cogito Ergo Sum


Verwijderd

Topicstarter
Kuhlie schreef op 19 augustus 2004 @ 09:52:
In het voorbeeld staat behalve een directory ook een bestandsnaam gespecificeerd. Misschien moet jij dat ook doen :P
Ik denk het niet. Waarom zou dit dan wel werken:

code:
1
2
$destination = "ftpaccess/";
$download= @ftp_get($conn, $port, $destination, $currFile, FTP_BINARY);


Hier heb ik toch ook geen bestandsnaam specifiek ingevul? $currFile is hier de bestandsnaam. Maar ik ga het in ieder geval wel proberen. Je weet het maar nooit.

Het site gedeelte met dit script zit in de map ftpaccess. Als ik bij destination ftpaccess/ invul doet hij het perfect.
De code E:\ wordt niet geaccepteerd. Dit resulteert in een error. De code E:/ wordt wel goed gekeurd, maar het werkt niet. Er worden geen bestanden op mijn E schijf opgeslagen.
Uiteindelijk moet het de bedoeling worden dat mensen via een knop bladeren zelf kunnen bepalen waar de files die ze vd ftp server downloaden worden opgeslagen. Vandaar dat ik eerst dit werkende wil hebben.

Hm ik heb misschien nog een idee. Ik ga thuis eens proberen om destination en currFile te linken. Dan krijg je dus: $destination = "E:/$currFile"; Geen idee of dat wel werkt maar ik kan het in ieder geval proberen.

Hoe dat ze aan deze code zijn gekomen weet ik niet, want een backslash \ wordt niet toegestaan. Zowel niet op een apache server op windows als op linux:
code:
1
2
3
If you want, you can save in any other directory in your hard disk, for example: 

ftp_get($ftpstream, "C:\somefile.exe", "somefile.exe", FTP_BINARY);

[ Voor 6% gewijzigd door Verwijderd op 19-08-2004 11:16 ]


Verwijderd

als je een var vult met zo iets:

$var = "aap noot mies";

dan is de \ een escape char om speciale tekens in te voeren als bijvoorbeeld een
enter of new line (deze zijn niet hetzelfde)

$var = "hoi\nfiets\n";

krijg je een string met 2 newlines er in

jou probleem zit hem in dat wanneer je in windos een \ in je path wilt hebben
moet je dit doen $var = "somepath\\somedir";

een betere oplossing is gebruiken van /
$var = "somepath/somedir";

dit hoort php automatisch te converten naar het native operatingsystem path

in jou geval $var = "e:/somepath/somedir/somefile.txt";


Have fun..

NederWiet

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 19-09 22:18

chem

Reist de wereld rond

Verwijderd schreef op 19 augustus 2004 @ 09:39:
[...]


Klopt, die staat ergens anders gedeclareerd. Het leek mij niet relevant om die er bij te zetten. Klopt die code overigens? Kan je er zo een poort achter zetten?

Ik zal thuis E:\\ eens proberen (ben nu aan het werk. Bijna laatste dag voor ik weer naar school kan 8)7)

Als er nog andere ideeen zijn hoor ik het graag.
Je snapt me niet... je geeft als local_file parameter nu $port op. Maw, je syntax van de functioncall is verkeerd zoals het hier staat.

Klaar voor een nieuwe uitdaging.


Verwijderd

Topicstarter
chem schreef op 19 augustus 2004 @ 11:39:
[...]

Je snapt me niet... je geeft als local_file parameter nu $port op. Maw, je syntax van de functioncall is verkeerd zoals het hier staat.
Ik begin te begrijpen wat je bedoelt. Door na $con een komma te zetten en dan de variable poort in te voeren gaat het fout. Dan wordt $port gezien als bestemming en niet $destination.
Hoe verwerk ik dan de poort varible in die code?

Verwijderd

Topicstarter
Ik kan mijn vorige message om de een of andere reden niet wijzigen. Dan maar er onder. Ik ben er achter dat je die poort alleen maar bij het connecten moet opgeven. De hele poortvariable moet er hier dus uit. :) Ga ik thuis onmiddelijk proberen (nog 5,5 uur voor ik naar huis mag :( )

Verwijderd

Verwijderd schreef op 19 augustus 2004 @ 11:30:
een betere oplossing is gebruiken van /
$var = "somepath/somedir";

dit hoort php automatisch te converten naar het native operatingsystem path
Ik denk niet dat PHP dat doet. Maar het is geen probleem om het zo te gebruiken, want op *NIX systemen is de / het padscheidingsteken, en op Windows mag je zowel \ als / gebruiken.

Dus / is de grootste gemene deler :)

Verwijderd

Topicstarter
Hij gaat het steeds beter doen. :) :) Op dit moment is de code:

code:
1
2
$destination = "E:/downloadtest/$currFile";
$download= @ftp_get($conn, $destination, $currFile, FTP_BINARY);


Er is nog 1 klein probleempje. Alle bestanden uit de root worden nu perfect in de map downloadtest gezet. Maar zodra je een map dieper gaat, dan bevat $currFile niet meer de bestandsnaam, maar bijvoorbeeld /images/plaatje.jpg
Is er een makkelijke kant en klare code die de bestandsnaam eruit pikt? Of moet ik het een of ander in elkaar knutsellen dat de bestandsnaam afsplitst van de padnaam?
edit: heb een beetje rond gezocht en ik gebruik op dit moment de volgende code voor het afsplitsen:

code:
1
2
3
4
5
6
7
8
9
//filenaam afgesplitst van pad.
$localFile = strrev($currFile);
$localFile = substr($localFile, 0, strpos($localFile, "/"));
$localFile = strrev($localFile);
$localFile = "$localFile";

//destination
$destination = "E:/downloadtest/$localFile";
$download= @ftp_get($conn, $destination, $currFile, FTP_BINARY);


Iemand nog betere ideeën?

[ Voor 33% gewijzigd door Verwijderd op 19-08-2004 20:18 ]


  • Kuhlie
  • Registratie: December 2002
  • Niet online
code:
1
$file = ereg_replace("^(.*[/\\])?([^/\\]+)$", "\\2", $path);

Verwijderd

Topicstarter
Hm deze code is idd een stuk compacter. Het lijkt nogal op de reguliere expressies die ik in perl heb gecodeerd. Wat doet deze code exact? Veranderd hij de backslash \ in een forwardslash / ? En wat zit er precies in de variable file? De padnaam met / / / ipv \ \ \?

Nu ben ik ook een invoer veld aan het maken waar users de padnaam kunnen opgeven waar de downloads moeten komen. Waarschijnlijk zullen veel windowsgebruikers er zoiets van maken: c:\..... Ik denk dat ik deze \ idd moet omzetten met een reguliere expressie. Kan ik daar jou voorbeeld voor gebruiken of moet ik het ietsje aanpassen? Ik denk dat de manier waarop perl expressies maakt niet helemaal zal werken in html/php ;)

[ Voor 3% gewijzigd door Verwijderd op 19-08-2004 22:34 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Zo het volgende probleem. Ik heb een formuliertje aangemaakt met een aantal velden voor server adres, poort, user en pass. Er gaat alleen iets goed mis met het ophalen van de gegevens:

code:
1
<form action ="ftp.php" method=post>


Deze code staat in het formulier.

Deze code staat in ftp.php:
code:
1
2
3
4
$ftpServer = $_POST['ftpServer'];
$ftpUser = $_POST['ftpUser'];
$ftpPass = $_POST['ftpPass'];
$port = $_POST['port'];


Deze namen komen overeen met de namen van de invoervelden:
code:
1
<input type="Text" name="ftpUser">

Het connecten gaat nog prima. Ik krijg keurig de inhoud van de server te zien. Ik heb de variable ftpServer, ftpUser, ftpPass en port laten printen met het echo commando. Ook dit ziet er helemaal kloppend uit. Maar zodra ik wil gaan scrollen door de directories/iets downloaden gaat het fout. De pagina moet heel lang laden met als resultaat dat er niets gebeurd.

Als ik er dit van maak:
code:
1
2
3
4
$ftpServer = "home.wanadoo.nl";
$ftpUser = "xxx";
$ftpPass = "xxx";
$port = 21;

Dan doet hij het perfect. Waarom werken mijn invoervelden niet?

Zou dit er iets mee te maken kunnen hebben:
code:
1
2
3
4
[img]'document.png'>
<a[/img]&currDir=<?php echo $currDir; ?>'>
<?php echo $trimFile; ?>
</a>

[ Voor 15% gewijzigd door Verwijderd op 20-08-2004 00:03 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Ja, bij vervolg requests worden er geen POST-variabelen meer meegestuurd; die zal je dus of ook weer moeten meesturen, of opslaan in een sessie.

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
crisp schreef op 20 augustus 2004 @ 09:29:
Ja, bij vervolg requests worden er geen POST-variabelen meer meegestuurd; die zal je dus of ook weer moeten meesturen, of opslaan in een sessie.
Hm dit begrijp ik niet helemaal. Wat bedoel je precies? De post variable worden toch in een variable opgeslagen? Vervolgens worden die variable overal aangesproken. Zelfs als ik de variable echo aan het einde dan geven ze de perfecte inhoud, dus ik begrijp niet waarom hij niet werkt?

Wat voor code zou ik er moeten inzetten om het te laten werken?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op 20 augustus 2004 @ 00:00:

Zou dit er iets mee te maken kunnen hebben:
code:
1
2
3
4
<img src='document.png'>
<a href='ftp.php?command=getFile&currFile=<?php echo $fList[$i]; ?>&currDir=<?php echo $currDir; ?>'>
<?php echo $trimFile; ?>
</a>
Hier heb je een linkje staan. Zodra hier op wordt gedrukt worden alleen command en currfile meegestuurd. Dit is een nieuw request. Aangezien je nu de inloggegevens niet meer meestuurt zijn ze dus niet bekend!

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Janoz schreef op 20 augustus 2004 @ 11:06:
[...]


Hier heb je een linkje staan. Zodra hier op wordt gedrukt worden alleen command en currfile meegestuurd. Dit is een nieuw request. Aangezien je nu de inloggegevens niet meer meestuurt zijn ze dus niet bekend!
Ik vind het raar om te begrijpen. In de eerste code worden de gegevens bewaard in een variable. Daar zou hij lijkt mij genoeg aan hebben. Maar als jij het zegt zal ik het maar aannemen. Dus ik moet overal die gegevens meesturen. Moet ik dan overal achter zetten:

code:
1
&ftpServer=<?php echo $ftpServer; ?>&ftpUser=<?php echo $ftpUser; ?>&ftpPass=<?php echo $ftpPass; ?>&$port=<?php echo $port; ?>


Dat komt dus hier achter:
code:
1
2
3
<a href='ftp.php?command=listFiles&currDir=<?php echo $parentDir; ?>'>
..
</a>

en
code:
1
<a href='ftp.php?command=listFiles&currDir=<?php echo $fList[$i]; ?>'>

en
code:
1
<a href='ftp.php?command=getFile&currFile=<?php echo $fList[$i]; ?>&currDir=<?php echo $currDir; ?>'


Doe ik het dan goed?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Bedenk dat elke keer als er een pagina gemaakt moet worden het script opnieuw draait. Al het vorige is dan 'vergeten' en php begint gewoon weer op regel 1.

Als je in script A var x hebt en een link naar script B verloopt het als volgt

Je vraagt A op.
Server verwerkt A en kent x aangezien die daar bekend is.
Het resultaat wordt naar de gebruiker verstuurd.
Script is klaar.

Gebruiker drukt op B
Server begint opnieuw maar nu met B.
Er is nu helemaal niks bekend over x of wat er dan ook verder bij A gebeurt is.
Resultaat wordt naar de gebruiker gestuurt
Klaar.


Als je alsnog dingen wilt onthouden per gebruiker, los van de verschillende requests, dan zul je even wat meer informatie over sessies moeten raadplegen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Zo mijn LAN party is voorbij dus het is weer tijd om te gaan programmeren. Ik ben mij eens gaan verdiepen in sessions. Behoorlijk lastige dingen om te begrijpen. Ik wil voor dit stuk nog even afzien van templates en het gewoon bij mijn textpad bestanden houden.
Ik heb uit mijn boek begrepen dat zo'n session start helemaal bovenaan moet staan. Ik heb nu een pagina ftp.html. Hier staat de hele opmaakcode + de benodigde invoervelden/knoppen voor mijn ftpclient op. Kijk zelf maar:

http://81.69.15.71/site/ftpaccess/ftp.html

Vervolgens heb ik een pagina ftp.php waar dat de code in moet komen die het hele gedoe moet laten werken. Ook hier staat de opmaakcode in voor de hele site alleen staat er op de plek waar dat bij ftp.html het forumulier staat nu de code. http://81.69.15.71/site/ftpaccess/ftp.php
Hoe krijg ik het nu voor elkaar dat hij de waardes uit ftp.html die ingevoerd zijn in de velden meeneemt in een session. Hoe roep ik vervolgens de sessie aan in ftp.php en haal de gegevens eruit die ik nodig heb?

Zo:?
[code]
<?php
session_register ("ftpServer");
session_register ("ftpUser");
session_register ("ftpPass");
session_register ("port");
?>

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Jep die had ik al gevonden, maar het blijft nogal lastig. Zeker om iets uit een form aan te nemen. Ik heb een simpel voorbeeldje gevolgd maar ik krijg errors.

Het zal waarschijnlijk aan de php configuratie in apache liggen. Ik krijg de volgende errors terug:

code:
1
2
3
4
5
6
7
8
9
Warning: session_start(): open(/tmp\sess_03eca5242b6c8e9421f1f842689a2500, O_RDWR) failed: No such file or directory (2) in D:\sites\ftpaccess\ftp.php on line 2

Warning: session_start(): Cannot send session cookie - headers already sent by (output started at D:\sites\ftpaccess\ftp.php:2) in D:\sites\ftpaccess\ftp.php on line 2

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at D:\sites\ftpaccess\ftp.php:2) in D:\sites\ftpaccess\ftp.php on line 2

Warning: Unknown(): open(/tmp\sess_03eca5242b6c8e9421f1f842689a2500, O_RDWR) failed: No such file or directory (2) in Unknown on line 0

Warning: Unknown(): Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/tmp) in Unknown on line 0


Het dumpcommando zelf werkt wel. Dit kreeg ik te zien met de var_dump code:
array(4) { ["ftpServer"]=> string(3) "adf" ["ftpUser"]=> string(8) "asdfasdf" ["ftpPass"]=> string(5) "asfda" ["port"]=> string(3) "adf" }

Enig idee hoe ik die foutmeldingen kan oplossen? In de php4.ini heb ik het volgende ingesteld: session.save_path = d:/temp
De map temp bestaat op schijf d. Enig idee hoe ik van die errors af kom?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb eens wat tests gedaan en ik heb het phpinfo(); commando gedraait. Hieruit blijkt iets vreemd. Mijn instelling in de php4.ini:
session.save_path = d:/temp
wordt compleet genegeerd!
Het onderstaande wordt weergegeven bij de phpinfo():
session.save_path

Local Value:
C:\PHP\sessiondata

Master Value
/tmp

Waarom pikt hij mijn invoer niet? Is er nog ergens een andere configuratiefile waar ik het session.save_path moet invoeren? de map temp op de d schijf is overigens gedeeld en heeft dus schrijfrechten.
Pagina: 1