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 */
}
-
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).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Datei beim herunterladen geöffnet werden muss, als eine binäre Datei
Danke für die Hilfe Rob
Dies ist eine Vermutung.:
Versuchen Sie, löschen die Optionen
CURLOPT_TRANSFERTEXT
undCURLOPT_CRLF
.Zitat:
Habe ich zum Ausdruck gebracht, so viel wie möglich auf einmal zu sehen, den Inhalt von Vivian Lobo.
Ich habe versucht zu testen, um Aussagen Vivian Lobo. Es ist gut zu arbeiten.
stackOverFlow ist schwer, code zu schreiben.
Und wie kann ich Kommentar zu Vivian lobo-Artikel?