Python轻量级Http服务器——Post接收上传文件(如图片)

1. 客户端使用libcurl(C++) 测试用例

//http post测试用例-Begin
        auto respCb = [=](const Json::Value json) {
            cout << "\nUpload gif success by http : " << item._gif_name.c_str() << endl;
        };

        dev::httpPostGif("192.168.2.40:8080", "testgif.gif",  g_appContext->cachePath, respCb);

        return 0;
        //http post测试用例-End
extern size_t writeCallback(void *buffer, size_t size, size_t nmemb, void *userp);
    void httpPostGif(const std::string& url, const std::string& filename, const std::string& path, ResponseHandler cb) {

        //发送超时时间
        const int time = 5;
        //超时重复发送次数
        int times = 3;

        //上传文件,指定本地文件完整路径
        std::string imagePath = path.c_str();
        imagePath.append(filename.c_str());

        //打开图片文件
        std::ifstream filestream(imagePath.c_str(), std::ifstream::in | std::ios::binary);
        //计算图片长度
        filestream.seekg(0, filestream.end);
        int length = filestream.tellg();
        std::cout << length << std::endl;
        filestream.seekg(0, filestream.beg);
        //创建内存缓存区
        char * buffer = new char[length];
        //读取图片
        filestream.read(buffer, length);
        //图片已经成功的被读取到内存(buffer)中

        //服务器URL的地址(包含端口 "192.168.1.1:8086")
        const char * Curl_addr = url.c_str();
        //curl_global_init(CURL_GLOBAL_ALL);

        CURL* hCurl = curl_easy_init();
        if(hCurl != NULL)
        {
            struct curl_slist *headers=NULL;
            //设定自定义头
            headers = curl_slist_append(headers,"Expect:");
            headers = curl_slist_append(headers, "user-agent: GuoKun.Chiu");
 
            curl_easy_setopt(hCurl, CURLOPT_HTTPHEADER, headers);
    
            struct curl_httppost* pFormPost = NULL;
            struct curl_httppost* pLastElem = NULL;
    
            /*curl_formadd(&pFormPost, &pLastElem,
                CURLFORM_COPYNAME, "body",                           //此处为别的参数
                CURLFORM_COPYCONTENTS, szJsonData,             //要上传的json字符串
                CURLFORM_END);*/

            curl_formadd(&pFormPost, &pLastElem, CURLFORM_PTRNAME, "file", CURLFORM_FILE, imagePath.c_str(), CURLFORM_END);
            LOG(DEBUG) << HTTP_LOG << "HttpPost Gif: url= " << url << "size = " << length;

            //设置写入回调 res一直返回23 暂不清楚 先注释 先手动调用回调
            //curl_easy_setopt(hCurl, CURLOPT_WRITEDATA, NULL);
            //curl_easy_setopt(hCurl, CURLOPT_WRITEFUNCTION, writeCallback);
            curl_easy_setopt(hCurl, CURLOPT_TIMEOUT, time);
            curl_easy_setopt(hCurl, CURLOPT_HTTPPOST, pFormPost);
            curl_easy_setopt(hCurl, CURLOPT_URL, Curl_addr);
    
            Json::Value response;
            CURLcode res;
            while(times > 0) {
                res = curl_easy_perform(hCurl);

                if(res != CURLE_OK)
                {
                    LOG(DEBUG) << HTTP_LOG << "HttpPost Gif: error= " << res << "out times:" << (3 - times + 1);
                    printf("curl_easy_perform error = %d, out times = %d \n", res, (3 - times + 1));
                    response["Resulf"] = 0;
                    cb(response);
                    times--;
                }
                else {
                    response["Resulf"] = 1;
                    cb(response);
                    times = 0;
                }
            }
            
            curl_formfree(pFormPost);
            curl_easy_cleanup(hCurl);
        }
    
        curl_global_cleanup();
    }

    size_t writeCallback(void *buffer, size_t size, size_t nmemb, void *userp)
    {
        printf("writeCallback success\n");
        return size;
    }

2. python编写的客户端测试用例

#coding=utf-8
import requests
url = 'http://192.168.2.40:8080'
path = u'C:\\Users\\guoju\\Downloads\\testln.jpg'
print path
files = {'file': open(path, 'rb')}
r = requests.post(url, files=files)
print r.url,r.text

 

3.python编写的服务器测试代码 使用2.7.9版本运行 脚本在哪个路径下运行起来 默认接收保存的文件路径就是该脚本所在路径

#coding=utf-8
from BaseHTTPServer import BaseHTTPRequestHandler
import cgi
class   PostHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        form = cgi.FieldStorage(
            fp=self.rfile,
            headers=self.headers,
            environ={'REQUEST_METHOD':'POST',
                     'CONTENT_TYPE':self.headers['Content-Type']
                     }
        )
        self.send_response(200)
        self.end_headers()
        self.wfile.write('Client: %s ' % str(self.client_address) )
        # 表单头使用self.headers获取了的字段 必须在发送POST时添加到heads里
        # 例如libcurl的post添加: headers = curl_slist_append(headers, "user-agent: GuoKun.Chiu");
        self.wfile.write('User-agent: %s' % str(self.headers['user-agent']))
        self.wfile.write('Path: %s'%self.path)
        self.wfile.write('Form data:')
        for field in form.keys():
            field_item = form[field]
            filename = field_item.filename
            filevalue  = field_item.value
            filesize = len(filevalue)#文件大小(字节)
            print len(filevalue)
            with open('copy'+filename.decode('utf-8'),'wb') as f:
                f.write(filevalue)
        return
if __name__=='__main__':
    from BaseHTTPServer import HTTPServer
    sever = HTTPServer(('192.168.2.40',8080),PostHandler)
    print 'Listening : ip = %s' % str('192.168.2.40')
    print 'Listening : port = %d' % 8080
    print 'HttpServer Starting , use <Ctrl-C> to stop'
    sever.serve_forever()

 


版权声明:本文为Tom_and_Jerry_zhao原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。