Dienstag, Dezember 10, 2019

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 mir curl: (1) Protocol https not supported or disabled in libcurl. Wenn ich versuche mit "http://" oder ohne "http://" es sagt curl: (7) couldn't connect to host.
  • Verwenden curl --version um zu sehen, was features curl.exe mit kompiliert wurde. Wenn HTTPS und SSL ist nicht erwähnt in den Listen unterstützt, können Sie keine Anfrage HTTPS URLs.
InformationsquelleAutor rturrado | 2011-10-06

3 Kommentare

  1. 7

    CURLINFO_CONTENT_LENGTH_UPLOAD ist die Anzahl der bytes, die hochgeladen werden. Sie benötigen CURLINFO_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 den Content-Length header), so CURLINFO_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.

    • Ich bin mit UPLOAD statt DOWNLOAD, weil ich in mehreren web-Seiten, dass dieser Begriff sei irreführend, und dass, wenn Sie wollten, dass die Größe einer Datei, die Sie herunterladen, sollten Sie verwenden, HOCHLADEN (kann es Sinn machen, da Sie sich über eine Datei, die bereits auf den server hochgeladen).
    • Wie auch immer, mit DOWNLOAD bekomme ich das gleiche Ergebnis -1.
    • BTW, Debuggen Sie den code, ich bin immer zu einem Punkt in libcurl, die Funktion Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...) selbst, wo es überprüft data->progress.flags, und da Sie null sind, gibt es, dass -1. Kann es sein, dass ich fehlende Einstellung eine option mit curl_easy_setopt?
    • Ist der server sendet eine success-oder failure-response-code? Ich würde vorschlagen, mit einem packet-sniffer, wie Wireshark, um sicherzustellen, dass libcurl ist die Zusendung einer gültigen Anfrage und sehen, welche Art von Antwort, die er erhält.
    • Ich kann nicht verwenden Sie wireshark, weil ich bin senden von https-Anfragen. Allerdings ist mein tool greift die server-Ausgabe. Was ich sehe, ist: 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.
    • Der server sendet eine Content-length header anstelle von Content-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?
    • Ich war mit einer session mit keinen Einstellungen auf alle abgesehen von der 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.

  2. 1

    rufen müssen perform()

    curl_easy_setopt(_curl_handle, CURLOPT_HEADER, 1);
    curl_easy_setopt(_curl_handle, CURLOPT_NOBODY, 1);

    curl_easy_perform(_curl_handle);

    curl_easy_getinfo(_curl_handle, CURLINFO_CONTENT_LENGTH_UPLOAD,
    &dResult);

    • Sollten Sie brauchen, um sowohl Kopf und Körper, wird es ein bisschen eine Herausforderung in der curl_easy_perform – so müssen Sie zu Holen/Puffer des Körpers (set CURLOPT_NOBODY entsprechend), bekommen dann die Größe, und führen Sie dann geeignete Dinge…

Kostenlose Online-Tests

Letzte Fragen

Tun ItemView löst Blase?

Ich habe eine CompositeView für eine Tabelle. Ich habe Trigger-set in der Kind-ItemView für jede Zeile... var TableRow = Marionette.ItemView.extend({ tagName:...

Wie kann ich untersuchen, WCF was 400 bad request über GET?

Die folgenden WCF-endpoint funktioniert gut mit dem WCF test client: AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int...

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad - /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen...

Actionscript-Objekt, das verschiedene Eigenschaften

Wie kann ich die Anzahl der Eigenschaften in einer generischen Actionscript-Objekt? (Wie die Array-Länge) InformationsquelleAutor Fragsworth | 2011-01-15

Wie plot mehrere Graphen und nutzen Sie die Navigations-Taste im [matplotlib]

Die neueste version von matplotlib erstellt automatisch Navigations-buttons unter den graph. Aber die Beispiele, die ich finden alles im Internet zeigen, wie erstellen Sie...