• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            浪跡天涯

            唯有努力...
            努力....再努力...

            libcurl上傳文件實例

            .

            Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. You can disable this header with CURLOPT_HTTPHEADER as usual.

            When setting CURLOPT_HTTPPOST, it will automatically set CURLOPT_NOBODY to 0 (since 7.14.1).


            CURLOPT_POST   --application/x-www-form-urlencoded形式

            A non-zero parameter tells the library to do a regular HTTP post. This will also make the library use the a "Content-Type: application/x-www-form-urlencoded" header. (This is by far the most commonly used POST method).

            Use one of CURLOPT_POSTFIELDS or CURLOPT_COPYPOSTFIELDS options to specify what data to post and CURLOPT_POSTFIELDSIZE or CURLOPT_POSTFIELDSIZE_LARGE to set the data size.

            Optionally, you can provide data to POST using the CURLOPT_READFUNCTION and CURLOPT_READDATA options but then you must make sure to not set CURLOPT_POSTFIELDS to anything but NULL. When providing data with a callback, you must transmit it using chunked transfer-encoding or you must set the size of the data with the CURLOPT_POSTFIELDSIZE or CURLOPT_POSTFIELDSIZE_LARGE option. To enable chunked encoding, you simply pass in the appropriate Transfer-Encoding header, see the post-callback.c example.

            You can override the default POST Content-Type: header by setting your own with CURLOPT_HTTPHEADER.

            Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. You can disable this header with CURLOPT_HTTPHEADER as usual.

            If you use POST to a HTTP 1.1 server, you can send data without knowing the size before starting the POST if you use chunked encoding. You enable this by adding a header like "Transfer-Encoding: chunked" with CURLOPT_HTTPHEADER. With HTTP 1.0 or without chunked transfer, you must specify the size in the request.

            When setting CURLOPT_POST to a non-zero value, it will automatically set CURLOPT_NOBODY to 0 (since 7.14.1).

            If you issue a POST request and then want to make a HEAD or GET using the same re-used handle, you must explicitly set the new request type using CURLOPT_NOBODY or CURLOPT_HTTPGET or similar.


            以上是兩種POST方式,具體代碼如下:
                ALLUPLOADFILES::iterator iter = allFiles.begin();
                
            //如果含有文件 //name="files"; filename="file1.txt"    
                if( bFileFlag ) //以form-dataf方式post
                {
                    
            for (;iter != allFiles.end();iter++)
                    
            {
                        
            if ( iter->isFile )
                        
            {
                            my_bytestr_url_encode(iter
            ->fileName);
                            curl_formadd(
            &post, &last, CURLFORM_COPYNAME , iter->contrlID.c_str(),
                                CURLFORM_BUFFER, iter
            ->fileName.c_str(),
                                CURLFORM_BUFFERPTR,iter
            ->data.c_str(),
                                CURLFORM_END);    
                        }

                        
            else
                        
            {
                            curl_formadd(
            &post, &last, CURLFORM_COPYNAME , iter->contrlID.c_str(),
                                CURLFORM_COPYCONTENTS,iter
            ->data.c_str(),
                                CURLFORM_END);    
                        }

                    }

                }

                
            else //以application/x-www-form-urlencoded方式post
                {
                    
            for (;iter != allFiles.end();iter++)
                    
            {
                        my_bytestr_url_encode(iter
            ->contrlID);
                        my_bytestr_url_encode(iter
            ->data);
                        postbuffer 
            += iter->contrlID;
                        postbuffer 
            += "=";
                        postbuffer 
            += iter->data;
                        postbuffer 
            += "&";
                    }

                }



                
            if (bFileFlag) 
                    curl_easy_setopt(curl, CURLOPT_HTTPPOST,post);
                
            else 
                
            {
                    curl_easy_setopt(curl, CURLOPT_POST,
            1);
                    curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS  , postbuffer.c_str());
                }


                code 
            = curl_easy_perform(curl);


            對于返回頁面,我們可以和上一篇文章所說那樣,設置write的回調函數,寫入文件即可:
                curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
                curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
                curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 
            1);
                curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);

            long writer(void
            *data, int size, int nmemb, string &content)
            {
                long sizes 
            = size * nmemb;
                string temp(data,sizes);
                printf(
            "receive data(%d bytes):\r\n%s",  sizes, (char*)data );
                content 
            += temp; 
                
            return sizes;
            }

            測試:
            我們可以用tomcat寫一個jsp上傳代碼測試一下,其中使用到了smartUpload組件,代碼如下:upload.html
            <form action="upload.jsp" method="post" ENCTYPE="multipart/form-data">

            輸入名稱:
            <input type="type" name="name"><br>

            選擇要上傳的圖片:

            <input type="file" name="pic">

            <input type="submit" value="上傳">

            </form>
            upload.jsp如下:
            <jsp:useBean id="smart" scope="page" class="org.lxh.smart.SmartUpload"/>

            <%
                   
            //上傳初始化
                   smart.initialize(pageContext);
                   
            //準備上傳
                   smart.upload();     
                   
            //保存上傳的文件
                   
            //smart.save("/upload");
                   
            //取得文件的擴展名稱
                   String ext = smart.getFiles().getFile(0).getFileExt();
            %>
            <%
                   
            //String name=request.getParameter("name"); 表單被封裝了,不能用這種方法取值.
                   String name=smart.getRequest().getParameter("name");
            %> 

                   
            //<%=name+"."+ext%>
            <%       //保存文件,包括改名.
                   smart.getFiles().getFile(0).saveAs("/upload/"+name+"."+ext);
            %>

            經測試用libcurl POST文件成功。以上是簡單的測試,比較深入的問題還有待進一步研究。
            由于我對HTTP協議,WEB這塊不是太熟,如果有錯誤理解不當的地方,還請指正,歡迎大家和我探討,謝謝!

            posted on 2008-07-03 16:49 浪跡天涯 閱讀(15617) 評論(3)  編輯 收藏 引用 所屬分類: Lib

            評論

            # re: libcurl上傳文件實例 2008-07-03 21:15 企業即時通訊

            容(提交失敗后,可以通過“恢復上次提交”恢復剛剛提交的內容)   回復  更多評論   

            # re: libcurl上傳文件實例 2008-09-11 13:40 浪跡天涯

            你說的是斷點續傳的問題,目前libcurl好像并不支持!  回復  更多評論   

            # re: libcurl上傳文件實例 2014-01-08 21:08 ]]]]

            ''''  回復  更多評論   

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            導航

            統計

            常用鏈接

            留言簿(22)

            隨筆分類(30)

            隨筆檔案(29)

            文章分類

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲国产精品无码久久青草| 亚洲а∨天堂久久精品9966| 久久影院综合精品| 久久精品毛片免费观看| 久久国产一区二区| 久久免费视频一区| 亚洲精品无码久久久久sm| 久久亚洲精品中文字幕三区| 亚洲精品乱码久久久久久蜜桃| 色综合久久无码中文字幕| 精品欧美一区二区三区久久久 | 亚洲人成无码网站久久99热国产| 精品国产青草久久久久福利| 情人伊人久久综合亚洲| 久久综合亚洲色HEZYO社区 | 日本欧美久久久久免费播放网| 91精品国产色综久久| 久久精品视频一| 久久久久女教师免费一区| 国产精品久久久久久福利漫画| 2021国产精品久久精品| 国产AⅤ精品一区二区三区久久| 亚洲精品乱码久久久久66| 久久这里有精品视频| 99久久婷婷免费国产综合精品| 狠狠色丁香久久婷婷综合| 久久免费香蕉视频| 精品久久综合1区2区3区激情| 情人伊人久久综合亚洲| 久久国产精品成人影院| 亚洲精品乱码久久久久66| 久久精品亚洲AV久久久无码| 亚洲国产成人精品无码久久久久久综合 | 午夜不卡久久精品无码免费| 久久久久久久综合综合狠狠| 国产精品VIDEOSSEX久久发布| 精品久久久久久综合日本| 久久91精品久久91综合| 久久不见久久见免费视频7| 久久久久亚洲AV无码专区体验| 久久午夜羞羞影院免费观看|