curl实现SFTP上传下载文件
摘自:https://blog.csdn.net/swj9099/article/details/85292444
1 #pragma once 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 #include <unistd.h> 6 #include <pthread.h> 7 #include <time.h> 8 #include <sys/stat.h> 9 #include <signal.h> 10 11 #include <curl/curl.h> 12 #include <curl/easy.h> 13 14 #include <string.h> 15 #include <fstream> 16 #include <iostream> 17 18 /* 19 g++ curl_test.cpp -I /usr/local/curl/include/ -I /usr/local/libssh2/include/ -I /usr/local/openssl/include/ -L /usr/local/curl/lib/ -L /usr/local/libssh2/lib/ -L /usr/local/openssl/lib/ -lrt -lcurl -lssh2 -lssl -lcrypto -ldl -lz 20 */ 21 22 using namespace std; 23 24 void gloale_init() 25 { 26 27 curl_global_init(CURL_GLOBAL_DEFAULT); 28 return; 29 } 30 31 size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream) //回调函数 32 { 33 curl_off_t nread; 34 size_t retcode = fread(ptr, size, nmemb, (FILE*)(stream)); 35 nread = (curl_off_t)retcode; 36 return retcode; 37 } 38 39 40 size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) 41 { 42 int written = fwrite(ptr, size, nmemb, (FILE *)stream); 43 return written; 44 } 45 46 size_t upload(const char * user,const char * passwd,const char * url, const char * path) 47 { 48 CURL *curl; 49 CURLcode res; 50 string s1(user); 51 string s2(passwd); 52 string s3 = s1 + ":" + s2; 53 cout<<s3<<endl; 54 // system("ls write_file"); 55 FILE* pSendFile = fopen(path,"r"); 56 if(pSendFile == NULL) 57 { 58 printf("open failed\n"); 59 return 1; 60 } 61 62 fseek(pSendFile, 0L, SEEK_END); 63 64 size_t iFileSize = ftell(pSendFile); 65 66 fseek(pSendFile, 0L, SEEK_SET); 67 printf("begin easy_init\n"); 68 69 curl = curl_easy_init(); 70 printf("curl_easy_init success\n"); 71 if(curl) { 72 curl_easy_setopt(curl, CURLOPT_URL,url); 73 curl_easy_setopt(curl, CURLOPT_USERPWD,s3.c_str()); 74 curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback); 75 curl_easy_setopt(curl, CURLOPT_READDATA, pSendFile); 76 curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, 0); 77 curl_easy_setopt(curl, CURLOPT_UPLOAD, 1); 78 curl_easy_setopt(curl, CURLOPT_INFILESIZE, iFileSize); 79 80 printf("curl_easy_setopt success"); 81 res = curl_easy_perform(curl); 82 83 curl_easy_cleanup(curl); 84 85 if(CURLE_OK != res) 86 { 87 88 fprintf(stdout, "curl told us %d\n", res); 89 } 90 } 91 fclose(pSendFile); 92 curl_global_cleanup(); 93 return 0; 94 } 95 96 97 int download(const char * user,const char * passw,const char * url,const char * filePath) 98 { 99 CURL *curl; 100 CURLcode curl_code; 101 string s1(user); 102 string s2(passw); 103 string s3 = s1 + ":" + s2; 104 cout<<s3<<endl; 105 curl = curl_easy_init(); 106 curl_easy_setopt(curl, CURLOPT_URL, url); 107 // curl_easy_setopt(curl, CURLOPT_USERPWD, s3.c_str()); 108 curl_easy_setopt(curl, CURLOPT_USERNAME, user); 109 curl_easy_setopt(curl, CURLOPT_PASSWORD, passw); 110 111 FILE *fp = fopen(filePath, "wb+"); 112 if (NULL == fp) 113 { 114 curl_easy_cleanup(curl); 115 printf("fopen failed\n"); 116 return -1; 117 } 118 119 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 120 curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); 121 curl_code = curl_easy_perform(curl); 122 printf("curl_code = %d\n",curl_code); 123 if (CURLE_OK != curl_code) 124 { 125 printf("perform failed\n"); 126 curl_easy_cleanup(curl); 127 fclose(fp); 128 remove(filePath); 129 return -1; 130 } 131 curl_easy_cleanup(curl); 132 133 fclose(fp); 134 135 return 0; 136 } 137 138 int main(int argc, char *argv[]) 139 { 140 gloale_init(); 141 char * serverip = "192.168.6.100"; 142 char * port = "22"; 143 char * serverpath = "/root/2.xml.bak"; 144 char *user = "root"; 145 char * passwd = "123456"; 146 char * savepath = "/root/2.xml"; 147 char url[125] = {0}; 148 149 sprintf(url,"sftp://%s:%s/%s",serverip,port,serverpath); 150 printf("url: %s\n", url); 151 // download(user,passwd,url,savepath); 152 upload(user,passwd,url,savepath); 153 154 return 0; 155 }