2015-09-01 174 views
0

第一次捲曲用戶,使用vC++的http multipart/form-data請求處理curl文件上載。multipart/form-data http post請求curl vC++

經過研究,我發現有兩種方法可以提出multipart/form-data請求。使用「CURLOPT_POSTFIELDS」將值設置爲數組或使用formadd並將指針傳遞給CURLOPT_POSTFIELDS。我決定做第二次,並使用「formdata」(兩個字段,一個文件(應用程序/ sla)和另一個來源(文本/純文本)配置請求的不同字段。

我使用wireshark來捕獲請求並看到CURL返回CURLE_READ_ERROR (26)然後我添加CURLFORM_FILECONTENT「tmp_3DButton.stl」並獲得CURL_OK,但發送請求的服務器返回「Bad Media Type」,並且我看到CURL沒有將我的請求作爲多部分發送。

(win8的64位,視覺工作室2015,捲曲,C++

    CURL *curl; 
        CURLcode res; 
        char error[CURL_ERROR_SIZE]; 

        struct curl_httppost *formpost = NULL; 
        struct curl_httppost *lastptr = NULL; 
        struct curl_slist *headerlist = NULL; 

        curl_global_init(CURL_GLOBAL_ALL); 

        // Fill in the file upload field 
        curl_formadd(&formpost, 
         &lastptr, 
         CURLFORM_COPYNAME, "file", 
         CURLFORM_CONTENTTYPE, "application/sla", 
         CURLFORM_FILECONTENT, "tmp.stl", 
         CURLFORM_FILE, filePathSTL, 
         CURLFORM_END); 

        // Fill in the filename field 
        curl_formadd(&formpost, 
         &lastptr, 
         CURLFORM_COPYNAME, "origin", 
         CURLFORM_CONTENTTYPE, "text/plain", 
         CURLFORM_FILENAME, "se_1_0", 
         CURLFORM_END); 

        curl = curl_easy_init(); 


        headerlist = curl_slist_append(headerlist, "Accept: text/plain"); 



        if (curl) { 
         // URL that receives this POST 
         curl_easy_setopt(curl, CURLOPT_URL, "http://blabla.com/upload"); 

         //multipart/form-data 
         curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist); 
         curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); 


         2); 
         curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error); 


         error[0] = 0; 
         // Perform the request, res will get the return code 
         res = curl_easy_perform(curl); 

         CString str; 
         // Check for errors 
         if (res != CURLE_OK) 
         { 
          str.Format("curl_easy_perform return %s [%d]", curl_easy_strerror(res), res); 
          size_t len = strlen(error); 
          if (len) 
          { 
           _bstr_t bstrt(error); 
           AfxMessageBox(error); 
          } 
         } 

         curl_easy_cleanup(curl); 

filePathSTL是例如bstrt(用雙斜線..)

回答

0

找到了答案,「CURLFORM_FILE」顯然需要一個字符串!