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);

if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
}
} else {

<?php
$context = stream_context_create(array(
'http' => array(
'header' => "Authorization: Basic " . base64_encode("$usernamehttp:$passwordhttp")
)
));

$data = file_get_contents($url, false, $context);
$xml= simplexml_load_string($data);

echo "<pre>".print_r($xml,true)."</pre>";
?>


Wat geeft dit?
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
Blijkbaar is de XML niet lekker valid.

En wat echo'ed $data voor output, waarbij je de simplexml_load_string even wegcomment.
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.
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?
Ad Fundum op 17/12/2020 21:17:30

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'){


$curl = curl_init($url);
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_HEADER, 1);

if($auth){
curl_setopt($curl, CURLOPT_USERPWD, "$auth");
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
}

if($fields){
$fields_string = http_build_query($fields);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $fields_string);
}

$response = curl_exec($curl);
$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$header_string = substr($response, 0, $header_size);
$body = substr($response, $header_size);

$header_rows = explode(PHP_EOL, $header_string);
$header_rows = array_filter($header_rows, trim);
foreach((array)$header_rows as $hr){
$colonpos = strpos($hr, ':');
$key = $colonpos !== false ? substr($hr, 0, $colonpos) : (int)$i++;
$headers[$key] = $colonpos !== false ? trim(substr($hr, $colonpos+1)) : $hr;
}
foreach((array)$headers as $key => $val){
$vals = explode(';', $val);
if(count($vals) >= 2){
unset($headers[$key]);
foreach($vals as $vk => $vv){
$equalpos = strpos($vv, '=');
$vkey = $equalpos !== false ? trim(substr($vv, 0, $equalpos)) : (int)$j++;
$headers[$key][$vkey] = $equalpos !== false ? trim(substr($vv, $equalpos+1)) : $vv;
}
}
}
//print_rr($headers);
curl_close($curl);
return array($body, $headers);
}
list($d['body'], $d['headers']) = curl('php link naar xml', array(q => '', auth => '$usernamehttp:$passwordhttp'));
//POST to google.com with POST var "q" as "123"

echo '<pre>';
print_r($d);
echo '</pre>';

zoiets ?

dit werkt voor de oude link perfect.

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
)

[X-XSS-Protection] => Array
(
[1] => 1
[mode] => block
)

[Strict-Transport-Security] => Array
(
[max-age] => 3153600
[2] =>
)

)

)

Hoe ziet de output eruit?

Reageren