downloaden bestand naar server script
Om te beginnen: ik weet (vrijwel) niks van programmeren.
Ik gebruik al paar jaar een script voor het downloaden van bestanden vanaf de website van leverancier naar mijn eigen server. dit script laat ik via cronjobs uitvoeren. Bij deze leverancier moest echter ingelogd worden voor het bestand gedownload kon worden.
Dit script is als volgt:
Quote:
Code (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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php
$remotefile = 'http://map.website.nl/csv/csv-voorraad.csv';
$localfile = '/home/u1667y88765/domains/mijnsite.nl/public_html/files/voorraad-leverancier.csv'; // <-- Change this to an existing directory where to store the xml file
// This file is needed to save the session cookie
$scalacookie ='tmp/leveranciercookie.txt'; // <-- Change this to an existing directory to store a temporary file containing the cookie (cookie jar)
$loginUrl = "https://www.websiteleverancier.nl/login.html";
// User name and password to login the wholesale website, a separate account can be create for this.
$user = '[email protected]'; // <-- put your login here
$pw = 'password'; // <-- put your password here
//init curl
$ch = curl_init();
//Set the URL to work with
curl_setopt($ch, CURLOPT_URL, $loginUrl);
// ENABLE HTTP POST
curl_setopt($ch, CURLOPT_POST, 1);
//Set the post parameters
curl_setopt($ch, CURLOPT_POSTFIELDS, 'login_email='.$user.'&login_password='.$pw);
//Handle cookies for the login
curl_setopt($ch, CURLOPT_COOKIEJAR, $scalacookie);
//Setting CURLOPT_RETURNTRANSFER variable to 1 will force cURL
//not to print out the results of its query.
//Instead, it will return the results as a string return value
//from curl_exec() instead of the usual true/false.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//execute the request (the login)
$store = curl_exec($ch);
//the login is now done and you can continue to get the
//protected content.
//set the URL to the protected file
curl_setopt($ch, CURLOPT_URL, $remotefile);
//execute the request
$content = curl_exec($ch);
// close session
curl_close($ch);
//save the data to disk
file_put_contents($localfile, $content);
?>
$remotefile = 'http://map.website.nl/csv/csv-voorraad.csv';
$localfile = '/home/u1667y88765/domains/mijnsite.nl/public_html/files/voorraad-leverancier.csv'; // <-- Change this to an existing directory where to store the xml file
// This file is needed to save the session cookie
$scalacookie ='tmp/leveranciercookie.txt'; // <-- Change this to an existing directory to store a temporary file containing the cookie (cookie jar)
$loginUrl = "https://www.websiteleverancier.nl/login.html";
// User name and password to login the wholesale website, a separate account can be create for this.
$user = '[email protected]'; // <-- put your login here
$pw = 'password'; // <-- put your password here
//init curl
$ch = curl_init();
//Set the URL to work with
curl_setopt($ch, CURLOPT_URL, $loginUrl);
// ENABLE HTTP POST
curl_setopt($ch, CURLOPT_POST, 1);
//Set the post parameters
curl_setopt($ch, CURLOPT_POSTFIELDS, 'login_email='.$user.'&login_password='.$pw);
//Handle cookies for the login
curl_setopt($ch, CURLOPT_COOKIEJAR, $scalacookie);
//Setting CURLOPT_RETURNTRANSFER variable to 1 will force cURL
//not to print out the results of its query.
//Instead, it will return the results as a string return value
//from curl_exec() instead of the usual true/false.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//execute the request (the login)
$store = curl_exec($ch);
//the login is now done and you can continue to get the
//protected content.
//set the URL to the protected file
curl_setopt($ch, CURLOPT_URL, $remotefile);
//execute the request
$content = curl_exec($ch);
// close session
curl_close($ch);
//save the data to disk
file_put_contents($localfile, $content);
?>
dit werkt voor 1 leverancier dus prima.
Nu wil ik dus voor andere leverancier gebruiken.
Maar als ik zelf wil inloggen moet ik inloggen op https://www.websiteleverancier.nl/login.html
maar het gewenste bestand moet ik downloaden vanaf http://map.website.nl/csv/csv-voorraad.csv en daar is dus geen gebruikersnaam en wachtwoord voor nodig.
Als ik nu via cron dat script uitvoer krijg ik een csv bestand met daarin het volgende:
Quote:
<html>
<head><title>405 Not Allowed</title></head>
<body bgcolor="white">
<center><h1>405 Not Allowed</h1></center>
<hr><center>nginx</center>
</body>
</html>
<head><title>405 Not Allowed</title></head>
<body bgcolor="white">
<center><h1>405 Not Allowed</h1></center>
<hr><center>nginx</center>
</body>
</html>
login gegevens kloppen.
Nu is bovenstaande doordat niet ingelogd hoeft te worden waarschijnlijk zo en zo veel te uitgebreid dus had ik op google gezocht naar ander script voor downloaden van een bestand via php. darabij kwam ik het volgende tegen:
Quote:
Maar als ik die start via een cronjob gebeurd er helemaal niks. word geen file voorraad-leverancier.csv aangemaakt.
wie kan me vertellen hoe ik dit probleempje kan oplossen zodat ook zonder in te loggen dat bestand naar mijn server gedownload wordt?
Groet
Daniel
Haal het @'je eens erg. Zie je bepaalde foutmeldingen?
en even meldingen van cron aangezet.
Krijg de volgende melding in mijn e-mail van de cronjob:
HTTP request sent, awaiting response... 500 Internal Server Error
2017-07-21 10:06:01 ERROR 500: Internal Server Error.
Dan is er iets mis met het script die jij oproept in je cron.
had dubbele
Nu nogmaals geprobeerd met en zonder de @.
Nu wordt er in beide gevallen wel een csv file aangemaakt op de goede plek.
Maar er staan in dat bestand maar 1 regel terwijl als ik file handmatig aanroep er 10.000 regels instaan.
Klopt, je doorloopt de csv niet, maar het alleen de eerste regel als element op.
fwrite($fh, $data[0]);
als ik daar 0 verander in 10 download hij een andere regel.
Hoe kan ik aangeven dat hij gewoon de hele file moet downloaden ongeacht aantal regels?
cURL uitkomst bieden, en voor grotere bestanden moet je misschien wat extra's doen.
Ook hier kan Met while() of foreach() doorlopen.
het bestand wordt nu keurig op mijn server opgeslagen. maakt de verwerking bijna 3 keer sneller als dat ik het verwerken van bestand vanaf de url van leverancier zelf deed.
Toevoeging op 21/07/2017 11:07:19:
Bedankt dus:-)