Herunterladen mehrerer Dateien von einem FTP-server Dateien mit Libcurl

Ich habe den folgenden code, um alle Dateien herunterladen vom FTP-Server

Schritte befolgt werden:
1. Erstellen einer FTP-Liste von Datei -

    getFTPList(string sHost, string sUser, string sPass, string sUri)
{
  CURL *curl;
  CURLcode res;
  FILE *ftplister;
  string host = "ftp://";
  host += sHost;
  host += "/sample/";
  string furl = host + sUri;  
  string usrpwd = sUser;
  usrpwd += ":";
  usrpwd += sPass;
  /* local file name to store the file as */ 
  ftplister = fopen("ftp-list", "wb"); /* b is binary, needed on win32 */   
  curl = curl_easy_init();
  if(curl) {
    /* Get a file listing from sunet */ 
    curl_easy_setopt(curl, CURLOPT_URL, furl.c_str() );
    curl_easy_setopt(curl, CURLOPT_USERPWD, usrpwd.c_str());
    curl_easy_setopt(curl, CURLOPT_FTPLISTONLY, TRUE);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &write_list);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, ftplister);
    res = curl_easy_perform(curl);
    /* Check for errors */ 
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));

    /* always cleanup */ 
    curl_easy_cleanup(curl);
  } 
  fclose(ftplister); /* close the local file */   
}
  1. Verwenden Sie diese Liste, um die Dateien herunterzuladen, den Aufruf der download-Funktionen rekursiv

    int main(){
    FILE *ftpfile; 
    string line;
    ftpfile = fopen("ftp-list", "r"); 
    ifstream infile("ftp-list");
     while ( getline(infile, line) )
     {
        string url, ofname, surl = "ftp://myhost/uploader/", sfname = "C:\\CNAP\\";        
        url = surl + line;
        ofname = sfname +line;
        cout<<url<<"   "<<ofname<<endl;
        char* theVal ;
        char* theStr ;
        theVal = new char [url.size()+1];
        theStr = new char [ofname.size()+1];
        strcpy(theVal, url.c_str());
        strcpy(theStr, ofname.c_str());       
        downloadFile(theVal, theStr);
     }
    return 0;
    }

Nun die download-Funktion:

size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
    size_t written;
    written = fwrite(ptr, size, nmemb, stream);
    return written;
   }

   void downloadFile(const char* url, const char* ofname)
   {
    CURL *curl;
        FILE *fp;
        CURLcode res;        
        curl = curl_easy_init();
        if (curl){
            fp = fopen(ofname,"wb");
            curl_easy_setopt(curl, CURLOPT_URL, url);
            curl_easy_setopt(curl, CURLOPT_USERPWD, "user:pass");
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
            res = curl_easy_perform(curl);
            curl_easy_cleanup(curl);
            fclose(fp);
        }
     }

Es funktioniert gut, wenn Sie umgesetzt wird aber nur zum herunterladen von text-Dateien oder einige Dateien mit Texten, wenn ich ein Bild downloaden oder eine docx oder eine zip-oder rar-oder für diese Angelegenheit, jede Datei, die nicht dem text, den er schlägt, schlägt es zu öffnen nach dem Download (sagt ungültige Datei).

Ich nicht sicher bin, was ich bin fehlt, jede mögliche Hilfe würde geschätzt.

Ich weiß, das ist eine ineffiziente Art und Weise der Kodierung, aber ich brauche nur die downloads, im Recht zu sein (eine Datei). Arbeiten an der Effizienz wird meine nächste agenda.

PS: diese Methode verwendet, hier
Download mehrerer Dateien mit libcurl in C++

Danke

  • mögliche Duplikate von Bild beschädigt, nachdem php-curl-transfer FTP
  • Es war nicht nur die Bild-Dateien beschädigt werden, aber alle Dateien außer die txt-Dateien. Ich bin mir nicht sicher wie, aber ich löste das problem, über den link, den Sie zur Verfügung gestellt. Es war das problem mit nicht zu öffnenden Dateien als Binär schreiben (wb).
InformationsquelleAutor Vivian Lobo | 2012-08-24
Schreibe einen Kommentar