Descargar un archivo en C++

Sheeraz Gul 15 febrero 2024
Descargar un archivo en C++

Este tutorial demuestra cómo descargar un archivo usando C++.

Descargar un archivo en C++

Descargar un archivo usando C++ es una operación fácil que se puede hacer usando la API win32 [URLDownloadToFile]). Esta API puede descargar un archivo en nuestra computadora desde el enlace dado.

Podemos guardar el elemento descargado como un archivo o cadena según nuestras necesidades. Ambos se pueden hacer usando diferentes operaciones.

Comencemos con la descarga como un archivo.

Descargar C++ como un archivo

Como se mencionó anteriormente, podemos usar la API win32 [URLDownloadToFile]), podemos descargar cualquier archivo desde el enlace dado. El archivo se guardará en el mismo directorio de trabajo.

Probemos un ejemplo.

#include <windows.h>

#include <cstdio>
#include <string>
#pragma comment(lib, "Urlmon.lib")

using namespace std;

int main() {
  // the URL from where the file will be downloaded
  string SourceURL = "https://picsum.photos/200/300.jpg";

  // destination file
  string DestinationFile = "DemoFile.jpg";

  // URLDownloadToFile returns S_OK on success
  if (S_OK == URLDownloadToFile(NULL, SourceURL.c_str(),
                                DestinationFile.c_str(), 0, NULL)) {
    printf("The file is successfully downloaded.");

    return 0;

  }

  else {
    printf("Download Failed");
    return -1;
  }
}

Antes de compilar el código anterior, se debe mencionar aquí que el código anterior solo funcionará con el compilador NSVC usando Visual Studio Express, Visual C++ o cualquier otro relacionado. No funcionará con el compilador MinGW porque no contiene la API URLDownloadToFile.

Una vez que ejecutemos el código anterior, descargará el archivo desde el enlace.

Ver la salida:

The file is successfully downloaded.

Descargar archivo C++

Descarga de C++ como una cadena de bytes

Este método utiliza la API de win32 URLOpenBlockingStream para descargar el archivo como una cadena de bytes que también se puede guardar en un archivo. Este es un proceso complicado paso a paso; siga los pasos a continuación.

  1. Primero, use URLOpenBlockingStream para obtener una interfaz IStream para la URL.
  2. Luego inserte la URL donde funcionarán los protocolos HTTP y HTTPS.
  3. Una vez que el IStream esté disponible, utilice la función leer para descargar los bytes. Es posible que necesitemos usar un bucle aquí.
  4. Una vez que los bytes se recopilan en una cadena, podemos guardarlos en un archivo o descargar la cadena.

Probemos un ejemplo basado en los pasos anteriores e intentemos obtener la página de inicio de Google en bytes.

#pragma comment(lib, "urlmon.lib")
#include <urlmon.h>

#include <cstdio>
#include <iostream>
#include <string>
#define getURL URLOpenBlockingStreamA

using namespace std;

int main() {
  IStream* DemoStream;
  const char* SourceURL = "http://google.com";

  if (getURL(0, SourceURL, &DemoStream, 0, 0)) {
    cout << "An Error has occured.";
    cout << "Please Check the internet";
    cout << "Please Check the source URL.";
    return -1;
  }

  // this char array will be filled with bytes from the URL
  char DemoBuff[100];
  // keep appending the bytes to this string
  string DemoStr;
  unsigned long Bytes_Read;

  while (true) {
    DemoStream->Read(DemoBuff, 100, &Bytes_Read);
    if (0U == Bytes_Read) {
      break;
    }
    // appending and collecting to the string
    DemoStr.append(DemoBuff, Bytes_Read);
  };

  DemoStream->Release();
  cout << DemoStr << endl;
  return 0;
}

El código anterior obtendrá la página de inicio de Google en una cadena de bytes; aunque no es eficiente descargar algo en una cadena de bytes, también podemos guardar los bytes en un archivo y usarlos más tarde. La salida del código anterior será una larga cadena de bytes.

Asegúrese de ejecutar el código anterior con el mismo compilador que el primer código porque URLOpenBlockingStream tampoco funcionará con el compilador C++ MinGW.

Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook