Red de conocimiento informático - Material del sitio web - Cómo utilizar libcurl para implementar el método HTTP GET para obtener la longitud del archivo

Cómo utilizar libcurl para implementar el método HTTP GET para obtener la longitud del archivo

En el proyecto, necesitamos crear un middleware de descarga. Descubrimos que libcurl es muy adecuado, por lo que elegimos libcurl para implementar la función de descarga HTTP.

Es muy conveniente usar libcurl para implementar la función de descarga, simplemente llame a la biblioteca libcurl.

Ver fragmentos de código derivados de mis fragmentos de código en Code.

curl_easy_init()

curl_easy_setopt()

curl_easy_perform()

curl_easy_getinfo()

Puedes descargar http, también hay muchos tutoriales de libcurl y mucha información en línea.

Existen muchas prácticas en línea para obtener la longitud de un archivo con libcurl, como se muestra a continuación:

Vea el fragmento de código derivado de mi fragmento de código aquí.

descarga largaFileLenth = 0;

CURL * handle = CURL_easy_init();

curl_easy_setopt(handle, CURLOPT_URL, URL);

curl_easy_setopt(handle, CURLOPT_HEADER, 1); //Solo se requiere el encabezado.

curl_easy_setopt(handle, CURLOPT_NOBODY, 1); //No se requiere cuerpo

if(curl_easy_perform(handle)= = CURLE_OK)

{

curl_easy_getinfo(handle, CURLINFO _ CONTENT _ LENGTH _ DOWNLOAD, & ampdownloadFileLenth

}

De lo contrario, {

downloadFileLenth =-1;

}

curl_easy_cleanup(handle);

Sin embargo, de forma predeterminada, este método se obtiene a través del modo HEAD de HTTP, pero no todos los servidores HTTP admiten HEAD. modo. Por ejemplo, en mi proyecto,

Hay un servidor HTTP que no admite el modo HEAD y solo puede usar el modo GET para obtener la longitud del archivo, por lo que este modo no es factible. Con suerte, esto se puede lograr con el siguiente fragmento:

Ver fragmentos de código derivados de mi fragmento de código.

descarga largaFileLenth = 0;

CURL * handle = CURL_easy_init();

curl_easy_setopt(handle, CURLOPT_URL, URL);

curl_easy_setopt(handle, CURLOPT_HTTPGET, 1); //Usar HTTPGET

curl_easy_setopt(handle, CURLOPT_NOBODY, 1); //No se requiere cuerpo

if(curl _ easy _ perform(handle) ) = = CURLE _ OK)

{

curl_easy_getinfo(handle, CURLINFO _ CONTENT _ LENGTH _ DOWNLOAD, & ampdownloadFileLenth

}

);

De lo contrario{

downloadFileLenth =-1;

}

curl_easy_cleanup(handle);

Pero encontrado Aún obtenido en head modo. Al observar el código fuente de libcurl, encontramos que cuando se configura CURLOPT_NOBODY, libcurl establecerá el modo de adquisición en modo principal de forma predeterminada. Si

Si ninguna opción está configurada, el contenido del archivo se descargará nuevamente. Entonces el código anterior no puede satisfacer.

No puedo evitar echar un vistazo al código fuente de libcurl y finalmente encontré la siguiente solución:

Ver fragmentos de código derivados del mío en el código.

descarga largaFileLenth = 0;

CURL * handle = CURL_easy_init();

curl_easy_setopt(handle, CURLOPT_URL, URL);

curl_easy_setopt(handle, CURLOPT_CUSTOMREQUEST, "GET"); //Usar CURLOPT_CUSTOMREQUEST

curl_easy_setopt(handle, CURLOPT_NOBODY, 1); //No se requiere cuerpo

if(curl _ easy _ perform (mango) = = CURLE _ OK)

{

curl_easy_getinfo(mango, CURLINFO _ CONTENT _ LENGTH _ DOWNLOAD, & ampdownloadFileLenth

}

En caso contrario{

downloadFileLenth =-1;

}

curl_easy_cleanup(handle);

Puede resolver perfectamente el problema de usar GET para obtener la longitud del archivo sin descargar el contenido del archivo.