Door
Michael vanDijk
op 15-12-2020 10:07
gewijzigd op 15-12-2020 10:12
6.981 views
Hoi allemaal,
ik kom er nu niet meer uit. heb alle php.net artikelen betreffende bestandsysteem doorgelopen maar krijg het niet voor elkaar.
wat ik wil bereiken.
ik haal via een externe site een xml bestand op.
deze wordt gegenereerd door een php bestand. dus het is op de externe site een download.
hierdoor kan ik hem niet uitlezen direct.
dus waarschijnlijk moet ik hem eerst opslaan op de server waar de php script draaien?
hoe kan ik deze wegschrijven naar een map.
file() fwrite() file_get_contents() al geprobeerd maar lukt me niet.
of kan ik hem gewoon openen en dan mijn dingen eruit halen die ik nodig heb. ?
heb het nodig voor dit gedeelte van de code
$context = stream_context_create(array(
'http' => array(
'header' => "Authorization: Basic " . base64_encode("$usernamehttp:$passwordhttp")
)
));
$data = file_get_contents($url, false, $context);
//$data = simplexml_load_string($url);
$data = simplexml_load_string($url);
echo "<pre>";
print_r($data);
echo "</pre>";
if($data) {
echo "<pre>".print_r($data,true)."</pre>";
} else {
// de XML kan niet worden uitgelezen, toon de foutmeldingen!
echo "XML-feed kan niet geladen worden:\n";
foreach(libxml_get_errors() as $error) {
echo "\t", $error->message;
}
}
dit werkt perfect in een ander script waar de xml wel op de server staat (dus niet als download wordt aangeboden)
$context = stream_context_create(array(
'http' => array(
'header' => "Authorization: Basic " . base64_encode("$usernamehttp:$passwordhttp")
)
));
$data = file_get_contents($url, false, $context);
$data = simplexml_load_string( $data );
// echo "<pre>";
// print_r($data);
// echo "</pre>";
//$rss = Feed::loadRss($data, $user, $pass);
foreach ($data->channel->item as $item) {
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
$timestamp = strtotime($item->pubDate);
$sql = "SELECT * FROM feed WHERE timestamp = '" . (int)$timestamp . "'";
$result = $conn->query($sql);
Warning: simplexml_load_string(): Entity: line 38: parser error : Opening and ending tag mismatch: link line 9 and head in /var/www/vhosts/.nl/httpdocs/power/feed3.php on line 29
Warning: simplexml_load_string(): </head> in /var/www/vhosts/.nl/httpdocs/power/feed3.php on line 29
Warning: simplexml_load_string(): ^ in /var/www/vhosts/.nl/httpdocs/power/feed3.php on line 29
Warning: simplexml_load_string(): Entity: line 301: parser error : Specification mandate value for attribute download in /var/www/vhosts/.nl/httpdocs/power/feed3.php on line 29
Ga er eerst eens vanuit dat $data helemaal geen xml bevat, en bekijk die inhoud eerst eens. Dus nog voordat je die aan de simplexml functies voert.
Want een beetje kapotte xml geeft die foutmelding, maar ook een html-error pagina die je zou vertellen dat je eerst nog moet inloggen of iets dergelijks.
?
Onbekende gebruiker
17-12-2020 21:17
gewijzigd op 17-12-2020 21:17
als ik de link in de browser zet krijg ik een bestand aangeboden
Waarschijnlijk geeft de webserver een andere output. Gebruik je wel dezelfde HTTP request headers, zoals een UA-string?
Misschien gaat het beter/gemakkelijker wanneer je cURL gebruikt?
als ik de link in de browser zet krijg ik een bestand aangeboden
Waarschijnlijk geeft de webserver een andere output. Gebruik je wel dezelfde HTTP request headers, zoals een UA-string?
Misschien gaat het beter/gemakkelijker wanneer je cURL gebruikt?
ik gebruik dezelfde code als voor een andere feed en die werkte perfect.
alleen die andere feed heeft een xml bestand op de server staan en deze pusht hem als download.
hier gaat het dan ook op fout.
ik zoek dus iets dat hij dat bestand accepteerd en dan pas verwerkt en hier loop ik vast.
ik heb al geprobeerd met file het bestand op te slaan maar dat lukte me niet.
iemand nog een idee om het met zoveel mogelijk de huidige code voor elkaar te krijgen ?
[size=xsmall]Toevoeging op 22/12/2020 14:33:36:[/size]
als ik de link in de adresbalk zet en enter dan krijg ik een xml bestand met goede waardes dus dat is verder goed.
kan ik dat xml bestand makkelijk opslaan op mijn eigen server en dan verwerken ?
Eigenlijk heeft die geforceerde download echt niks te maken met het ophalen.
Ikzelf haal elke dag geautomatiseerd een sloot XML's/RSS-feeds op waarvan ik weet dat er een aantal feed bijzitten met een 'geforceerde downloadheader'. Hier heb ik echt 0,0 last van. Puur omdat file_get_contents of cURL die gewoon netjes negeert.
Dus waarom steeds die tunnelvisie op dit gedrag?
Het belangrijkste is al genoemd: Bekijk eens wat je nou terug krijgt. Daar staat vast wel een aanwijzing in. Misschien mis je iets in een authenticatie, of een bepaalde instelling en krijg je een foutmelding wat je script dus niet verwacht. Uit je foutmeldingen kan ik al opmaken dat je een HTML-document terug lijkt te krijgen omdat er gesproken werd over een </head>.
ik krijg de inlog pagina terug. met een link naar een pdf bestand.
terwijl de inlog werkt voor de andere feeds daar is dus niks mis mee... het is het zelfde account zelfde user.
hoe zou ik het met curl moeten doen ik zie nergens een voorbeeld hoe ik dat kan implementeren.
het is geen tunnelvisie (misschien trouwens wel ;-) maar enige variable die veranderd is dat hij nu die xml pusht en niet verwerkt daarom dacht ik dat het toch echt met die download te maken had...
hij kan hem toch niet verwerken zonder ergens een temp bestand te maken of het bestand te downloaden ?
[size=xsmall]Toevoeging op 23/12/2020 09:43:19:[/size]
function curl2($url, $fields = array(), $auth = 'user:pass'){
voor de link naar de download krijg ik in de body "Redirecting hoop html tekst "
[headers] => Array
(
[0] => HTTP/1.1 302 Found
[Date] => Wed, 23 Dec 2020 08:51:50 GMT
[Server] => Apache
[Location] => /login.php
[Content-Length] => 2609
[Connection] => close
[X-Frame-Options] => DENY
[X-Content-Type-Options] => nosniff
[Content-Type] => Array
(
[0] => text/html
[charset] => UTF-8
)