Wie man die Länge einer Datei ohne das herunterladen der Datei in eine cURL-binary get-Anforderung
Ich möchte erstellen Sie eine cURL-Anfrage in einigen C++ - code, das wird mir die Länge einer Datei in einem server, ohne die Datei herunterzuladen. Für die, ich einige cURL-Optionen zu sagen, ich will nur den Header im Anfrage-Antwort, und dann untersuche ich die Antwort zu bekommen die Länge der Datei.
Ich werde die folgenden Optionen für die Anforderung:
curl_easy_setopt(_curl_handle, CURLOPT_HEADER, 1);
curl_easy_setopt(_curl_handle, CURLOPT_NOBODY, 1);
Dann die Verarbeitung der Anfrage, wartet die Antwort, das zeigt eine OK=200
, und schließlich Auskunft über die Länge der Datei:
curl_easy_getinfo(_curl_handle, CURLINFO_CONTENT_LENGTH_UPLOAD, &dResult);
Aber ich bekomme eine Datei Länge von -1
. Laut cURL-Dokumentation, das bedeutet, dass die Größe ist unbekannt. Wie kann es passieren, dass cURL nicht die Länge der Datei-Informationen von dem server?
- Es ist nicht ungewöhnlich, dass Informationen nicht zur Verfügung stehen. Versuchen Sie
curl --head
auf die gleiche URL von der Kommandozeile aus, und sehen, ob es zeigt die Größe der Datei. - Wenn ich einen
curl --head "https://..."
sagt es mircurl: (1) Protocol https not supported or disabled in libcurl
. Wenn ich versuche mit"http://"
oder ohne"http://"
es sagtcurl: (7) couldn't connect to host
. - Verwenden
curl --version
um zu sehen, was features curl.exe mit kompiliert wurde. WennHTTPS
undSSL
ist nicht erwähnt in den Listen unterstützt, können Sie keine AnfrageHTTPS
URLs.
Du musst angemeldet sein, um einen Kommentar abzugeben.
CURLINFO_CONTENT_LENGTH_UPLOAD
ist die Anzahl der bytes, die hochgeladen werden. Sie benötigenCURLINFO_CONTENT_LENGTH_DOWNLOAD
statt.Beachten Sie, dass wenn der server dynamisch generiert die Daten, die Länge kann unterschiedlich sein, wenn Sie tatsächlich die Datei herunterzuladen Vergleich nur die Kopfzeilen herunterladen.
Beachten Sie auch, dass, wenn der server sendet die Daten komprimiert, wenn Sie heruntergeladen ist, es kann nicht jeder Größe zur Verfügung, die in der Header (falls die
Transfer-Encoding
header wird verwendet, anstatt denContent-Length
header), soCURLINFO_CONTENT_LENGTH_DOWNLOAD
würde noch zurück-1
. Der einzige Weg, zu wissen, die Größe in dieser situation wäre es zu downloaden in voller Höhe.-1
.Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
selbst, wo es überprüftdata->progress.flags
, und da Sie null sind, gibt es, dass-1
. Kann es sein, dass ich fehlende Einstellung eine option mitcurl_easy_setopt
?HTTP/1.1 200 OK Content-length: 213 Content-Type: text/xml;charset=ISO-8859-1 Date: Mon, 10 Oct 2011 10:52:31 GMT Vary: Accept-Encoding X-Powered-By: Servlet 2.5; JBoss-5.0/JBossWeb-2.1 Connection: keep-alive
ich bekomme immer ein "content-length" 213 für binäre ich Anfrage.Content-length
header anstelle vonContent-Length
. Stellen Sie sicher, dass die nicht stolpern, libcurl HTTP-header-parser irgendwie. Da libcurl ist open-source, haben Sie versucht, Durchlaufen seine Quelle genau zu sehen, wie es analysiert die Antwort des Servers?CURLOPT_NOBODY
. Sobald ich die Sitzung bis - (proxy, user-agent, und so weiter), habe ich begonnen, erhalten die korrekte content-length für jede binäre ich wurde beantragt.Haben Sie versucht, mit CURLINFO_CONTENT_LENGTH_DOWNLOAD statt?
rufen müssen
perform()
curl_easy_perform(_curl_handle);