一、客户端文件上传
libcurl上传文件有两种方式:
1、直接上传文件,类似form表单<input type=”file” />,<form enctype=”multipart/form-data”…;
2、上传二进制流;
设定自定义头,都是使用一样的方法
struct curl_slist *headers=NULL; headers = curl_slist_append(headers, "Content-Type: text/xml"); headers = curl_slist_append(headers, "Accept: text/html, */*;q=0.01"); //... //set headers curl_easy_setopt(easyhandle, CURLOPT_HTTPHEADER, headers); //last free the header list curl_slist_free_all(headers); /* free the header list */
附上开发中写的程序代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 int UploadFile(char *file_name, char *dir_name, char *save_name) 2 { 3 char buff[128]; 4 CURL *curl; 5 6 CURLM *multi_handle; 7 int still_running; 8 9 struct curl_httppost *formpost=NULL; 10 struct curl_httppost *lastptr=NULL; 11 struct curl_slist *headerlist=NULL; 12 static const char buf[] = "Expect:"; 13 14 sprintf(buff, "%s%s%s%s", dir_name, "-", save_name, ".jpg"); 15 /* Fill in the file upload field. This makes libcurl load data from 16 the given file name when curl_easy_perform() is called. */ 17 curl_formadd(&formpost, 18 &lastptr, 19 CURLFORM_COPYNAME, "file", 20 CURLFORM_FILE, file_name, 21 CURLFORM_CONTENTTYPE, "Image/jpeg", 22 CURLFORM_FILENAME, buff, 23 CURLFORM_END); 24 25 /* Fill in the filename field */ 26 curl_formadd(&formpost, 27 &lastptr, 28 CURLFORM_COPYNAME, "filename", 29 CURLFORM_COPYCONTENTS, save_name, 30 CURLFORM_END); 31 32 /* Fill in the submit field too, even if this is rarely needed */ 33 curl_formadd(&formpost, 34 &lastptr, 35 CURLFORM_COPYNAME, "directory", 36 CURLFORM_COPYCONTENTS, dir_name, 37 CURLFORM_END); 38 39 curl = curl_easy_init(); 40 multi_handle = curl_multi_init(); 41 42 /* initalize custom header list (stating that Expect: 100-continue is not 43 wanted */ 44 headerlist = curl_slist_append(headerlist, buf); 45 if(curl && multi_handle) { 46 47 /* what URL that receives this POST */ 48 curl_easy_setopt(curl, CURLOPT_URL, "https://app.sopings.com/lock/control/_UploadFile.php"); 49 curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); 50 51 curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist); 52 curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); 53 54 if (1) { 55 curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); 56 curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0); 57 } 58 59 curl_multi_add_handle(multi_handle, curl); 60 61 curl_multi_perform(multi_handle, &still_running); 62 63 do { 64 struct timeval timeout; 65 int rc; /* select() return code */ 66 67 fd_set fdread; 68 fd_set fdwrite; 69 fd_set fdexcep; 70 int maxfd = -1; 71 72 long curl_timeo = -1; 73 74 FD_ZERO(&fdread); 75 FD_ZERO(&fdwrite); 76 FD_ZERO(&fdexcep); 77 78 /* set a suitable timeout to play around with */ 79 timeout.tv_sec = 1; 80 timeout.tv_usec = 0; 81 82 curl_multi_timeout(multi_handle, &curl_timeo); 83 if(curl_timeo >= 0) { 84 timeout.tv_sec = curl_timeo / 1000; 85 if(timeout.tv_sec > 1) 86 timeout.tv_sec = 1; 87 else 88 timeout.tv_usec = (curl_timeo % 1000) * 1000; 89 } 90 91 /* get file descriptors from the transfers */ 92 curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); 93 94 /* In a real-world program you OF COURSE check the return code of the 95 function calls. On success, the value of maxfd is guaranteed to be 96 greater or equal than -1. We call select(maxfd + 1, ...), specially in 97 case of (maxfd == -1), we call select(0, ...), which is basically equal 98 to sleep. */ 99 100 rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); 101 102 switch(rc) { 103 case -1: 104 /* select error */ 105 break; 106 case 0: 107 default: 108 /* timeout or readable/writable sockets */ 109 printf("perform! "); 110 curl_multi_perform(multi_handle, &still_running); 111 printf("running: %d! ", still_running); 112 break; 113 } 114 } while(still_running); 115 116 curl_multi_cleanup(multi_handle); 117 118 /* always cleanup */ 119 curl_easy_cleanup(curl); 120 121 /* then cleanup the formpost chain */ 122 curl_formfree(formpost); 123 124 /* free slist */ 125 curl_slist_free_all (headerlist); 126 } 127 return 0; 128 }
服务器端的接收代码(PHP)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?php require_once (__DIR__."/../libs/Error.php"); include_once (__DIR__."/../db/Db.php"); /** * 上传文件 * @author 戴栋根 * @version 1.0 * @created 16-三月-2016 */ if ((($_FILES["file"]["type"] == "Image/png") || ($_FILES["file"]["type"] == "Image/jpeg") || ($_FILES["file"]["type"] == "Image/pjpeg")) && ($_FILES["file"]["size"] < 10000000)) { if ($_FILES["file"]["error"] > 0) { echo Error::getRetString(10021); } else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; if (!file_exists($_FILES["directory"]["type"])) { mkdir ($_FILES["directory"]["type"]); } if (file_exists($_FILES["directory"]["type"]."/" . $_FILES["filename"]["type"])) { echo $_FILES["file"]["name"] . " already exists. "; } else { move_uploaded_file($_FILES["file"]["tmp_name"], $_FILES["directory"]["type"]."/" . $_FILES["filename"]["type"]); echo "Stored in: " . $_FILES["directory"]["type"]."/" . $_FILES["filename"]["type"]; } } } else { echo Error::getRetString(10007); } ?>