【易开嵌入式】linux下使用licurl上传表单文件

版权声明:本版面文章皆为原创、或参考其他技术网站、博客后自己动手做实验所得,转载请注明出处。

商务合作:lz_kwok@foxmail.com

易开嵌入式工作室

 

        使用http协议来上传客户端文件,目前基本上所有的浏览器和web服务器都支持http文件上传,它的使用也十分的简单,具体的来说就是在页面上创建一个form表单,表单的enctype属性为multipart/form-data,action为接收上传文件的cgi url,请求方式为post,在表单中添加type属性为file的input,file input里面选择需要上传的文件,选择好后点击submit,服务器端收到multipart post请求后,会根据相关协议解析请求,然后保存上传的文件内容。

        那么,在linux环境下如何实现呢?linux下libcurl是非常好用的库,下面用libcurl实现上述功能

 

CURLcode curl_base::Upload(std::string strUrl,std::string filepath)
{
    CURL* curl = NULL;
    CURLcode res;
 
    CURLM *multi_handle;  
    int still_running;  
    
    struct curl_httppost *formpost=NULL;  
    struct curl_httppost *lastptr=NULL;  
    struct curl_slist *headerlist=NULL;  
    static const char buf[] = "Expect:";  
    
    /* Fill in the file upload field. This makes libcurl load data from 
        the given file name when curl_easy_perform() is called. */  
    curl_formadd(&formpost,  
                &lastptr,  
                CURLFORM_COPYNAME, "uploadLog",  
                CURLFORM_FILE, const_cast<char*>(filepath.c_str()),  
                CURLFORM_END);  
    
    /* Fill in the filename field */  
    curl_formadd(&formpost,  
                &lastptr,  
                CURLFORM_COPYNAME, "filename",  
                CURLFORM_COPYCONTENTS, "ota.conf",  
                CURLFORM_END);  
    
    /* Fill in the submit field too, even if this is rarely needed */  
    curl_formadd(&formpost,  
                &lastptr,  
                CURLFORM_COPYNAME, "submit",  
                CURLFORM_COPYCONTENTS, "send",  
                CURLFORM_END);  
    
    curl = curl_easy_init();  
    multi_handle = curl_multi_init();  
    
    /* initalize custom header list (stating that Expect: 100-continue is not 
        wanted */  
    headerlist = curl_slist_append(headerlist, buf);  
    if(curl && multi_handle) {  
    
        /* what URL that receives this POST */  
        curl_easy_setopt(curl, CURLOPT_URL, const_cast<char*>(strUrl.c_str()));  
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);  
        
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);  
        curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);  
        
        curl_multi_add_handle(multi_handle, curl);  
        
        curl_multi_perform(multi_handle, &still_running);  
        
        do {  
            struct timeval timeout;  
            int rc; /* select() return code */  
        
            fd_set fdread;  
            fd_set fdwrite;  
            fd_set fdexcep;  
            int maxfd = -1;  
        
            long curl_timeo = -1;  
        
            FD_ZERO(&fdread);  
            FD_ZERO(&fdwrite);  
            FD_ZERO(&fdexcep);  
        
            /* set a suitable timeout to play around with */  
            timeout.tv_sec = 1;  
            timeout.tv_usec = 0;  
        
            curl_multi_timeout(multi_handle, &curl_timeo);  
            if(curl_timeo >= 0) {  
            timeout.tv_sec = curl_timeo / 1000;  
            if(timeout.tv_sec > 1)  
                timeout.tv_sec = 1;  
            else  
                timeout.tv_usec = (curl_timeo % 1000) * 1000;  
            }  
        
            /* get file descriptors from the transfers */  
            curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);  
        
            /* In a real-world program you OF COURSE check the return code of the 
                function calls.  On success, the value of maxfd is guaranteed to be 
                greater or equal than -1.  We call select(maxfd + 1, ...), specially in 
                case of (maxfd == -1), we call select(0, ...), which is basically equal 
                to sleep. */  
        
            rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);  
        
            switch(rc) {  
                case -1:  
                    /* select error */  
                break;  
                case 0:  
                default:  
                    /* timeout or readable/writable sockets */  
                    printf("upload!\n");  
                    curl_multi_perform(multi_handle, &still_running);  
                    printf("running: %d!\n", still_running);  
                break;  
            }  
        } while(still_running);  
        
        curl_multi_cleanup(multi_handle);  
        
        /* always cleanup */  
        curl_easy_cleanup(curl);  
        
        /* then cleanup the formpost chain */  
        curl_formfree(formpost);  
        
        /* free slist */  
        curl_slist_free_all (headerlist);  
    }  
    
    return res;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值