Ist es möglich, eine Remote-Datei mit cURL teilweise herunterzuladen? Nehmen wir an, die tatsächliche Dateigröße der Remote-Datei beträgt 1000 KB. Wie kann ich nur die ersten 500 KB herunterladen?Wie eine Remote-Datei mit cURL teilweise herunterladen?
Antwort
Sie können auch den Bereich Header-Parameter mit der php-curl Erweiterung gesetzt.
Aber wie bereits erwähnt, wenn der Server diesen Header nicht honoriert, aber die ganze Datei curl sendet, wird alles heruntergeladen. Z.B. http://www.php.net ignoriert die Kopfzeile. Sie können jedoch (zusätzlich) einen Schreibfunktionsrückruf einstellen und die Anforderung abbrechen, wenn mehr Daten empfangen werden, z.
// php 5.3+ only
// use function writefn($ch, $chunk) { ... } for earlier versions
$writefn = function($ch, $chunk) {
static $data='';
static $limit = 500; // 500 bytes, it's only a test
$len = strlen($data) + strlen($chunk);
if ($len >= $limit) {
$data .= substr($chunk, 0, $limit-strlen($data));
echo strlen($data) , ' ', $data;
return -1;
}
$data .= $chunk;
return strlen($chunk);
};
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.php.net/');
curl_setopt($ch, CURLOPT_RANGE, '0-500');
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_WRITEFUNCTION, $writefn);
$result = curl_exec($ch);
curl_close($ch);
+1 für eine gute Antwort. Dies funktioniert, weil $ writefn() -1 zurückgibt, wenn das Limit erreicht ist. Wenn die Callback-Funktion einen anderen Wert als die Anzahl der übergebenen Bytes (in $ chunk) zurückgibt, bricht curl die Verbindung ab. – GZipp
Ausgezeichnet. Als ich das gleiche in Perl machte, musste ich einen Alarm verwenden, der ausgelöst und auf die Dateigröße überprüft wurde, weil es keine bessere Methode gab. Sehr hacky aber es hat funktioniert. –
Genau was ich brauchte. Erwähnenswert ist aber auch die CURLOPT_BUFFERSIZE, die die Chunkgröße definiert. Wenn Ihr Puffer also sehr groß ist, könnte die Chunk-Größe leicht eine ganze Webseite mit Daten enthalten (ich denke!) –
Holen Sie sich die ersten 100 Bytes eines Dokuments:
curl -r 0-99 http://www.get.this
aus dem Handbuch
stellen Sie sicher, Sie haben eine moderne curl
Sie sind richtig, aber ich fand, dass es nicht immer zuverlässig ist und hängt auf dem Server und nicht selbst einrollen. In den missverstandenen Fällen würde curl einfach weiter herunterladen. –
Ich kann nicht herunterladen, wenn ich einen anderen Bereich verwende, z. B. 100-200. Ich bekomme "curl error (18)". Kann das gelöst werden? – akashrajkn
dies Ihre Lösung sein könnte (Download ersten 500KB in output.txt)
curl -r 0-511999 http://www.yourwebsite.com > output.txt
- während
511999
ist500^1024-1
Danke für die nette Lösung Volkerk. Allerdings musste ich diesen Code als Funktion verwenden, also hier ist, was ich herausgefunden habe. Ich hoffe, es ist nützlich für andere. Der Hauptunterschied ist ($ limit, & $ datadump), so dass ein Limit übergeben werden kann und die By-Referenzvariable $ datadump verwendet werden kann, um sie als Ergebnis zurückgeben zu können. Ich habe auch CURLOPT_USERAGENT hinzugefügt, da einige Websites keinen Zugriff ohne einen User-Agent-Header erlauben.
prüfen http://php.net/manual/en/functions.anonymous.php
function curl_get_contents_partial($url, $limit) {
$writefn = function($ch, $chunk) use ($limit, &$datadump) {
static $data = '';
$len = strlen($data) + strlen($chunk);
if ($len >= $limit) {
$data .= substr($chunk, 0, $limit - strlen($data));
$datadump = $data;
return -1;
}
$data .= $chunk;
return strlen($chunk);
};
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
//curl_setopt($ch, CURLOPT_RANGE, '0-1000'); //not honored by many sites, maybe just remove it altogether.
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_WRITEFUNCTION, $writefn);
$data = curl_exec($ch);
curl_close($ch);
return $datadump;
}
Nutzung:
$ page = curl_get_contents_partial ('http://some.webpage.com', 1000); // lese die ersten 1000 Bytes
echo $ page // oder mache was auch immer mit dem Ergebnis.
- 1. Teilweise Seite curl Animation
- 2. PHP CURL Datei herunterladen
- 3. Herunterladen von Xcode mit wget oder curl
- 4. Datei herunterladen mit Curl auf Button klicken
- 5. Herunterladen der neuesten Datei mit Wget/Curl
- 6. Ubuntu: Mit curl ein Bild herunterladen
- 7. Wie werden bereits vorhandene Dateien beim Herunterladen mit curl übersprungen?
- 8. Herunterladen von Dateien mit Curl mit Zeitstempel oder anderen Namen?
- 9. Einen Tarball von github ohne curl herunterladen
- 10. Curl Timeout beim Herunterladen von xml
- 11. herunterladen Github bauen Artefakt (release) wget/curl
- 12. Herunterladen eines Bilds von einer externen URL mit cURL
- 13. Herunterladen von Artefakten aus Jenkins mit wget oder curl
- 14. php - Zip-Datei mit curl herunterladen und entpacken?
- 15. Selen Remotedatei-Upload funktioniert nicht mit Firefox Browser
- 16. Wie wget/curl nach einer Weiterleitung zum Herunterladen von Inhalten?
- 17. Wie WWDC 2010 Video jetzt von curl oder wget herunterladen?
- 18. So laden Sie eine Datei mit curl
- 19. Wie man eine teilweise Krümmung modal nicht ausblenden Symbolleiste einrichtet?
- 20. wie eine Zip-Datei mit eckigen herunterladen
- 21. wie eine Datei mit Broadcast-Empfänger herunterladen?
- 22. PHP + PDF, wie man eine heruntergeladene PDF mit curl speichert?
- 23. Wie Sie eine Facebook-Werbeanzeige CURL erstellen
- 24. So laden Sie eine Datei von owncloud mit curl, wget
- 25. Teilweise mit mehreren Variablen
- 26. Laden Sie eine Datei von Dropbox mit cURL herunter
- 27. Teilweise Aktualisierung des Objekts
- 28. Wie PHP cURL wie als cURL-Befehlszeile
- 29. wie cURL
- 30. wie man teilweise Seitenaktualisierung mit jquery tut
Header verwenden: https://unix.stackexchange.com/questions/121314/download-only-a-part-of-a-file –