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测试用例-Endextern 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版权协议,转载请附上原文出处链接和本声明。