linuxcurl发送⽂件和sockettcp通讯
linux curl发送⽂件
背景
linux 下要实现传输图⽚到服务器,然后想到了⽤curl 上传到go-fastdfs(基于http的分布式⽂件⾥系统),这个不同于服务器,是和服务器独⽴开来的.
上传⽂件的话有web⽅式和终端curl⽅式和libcurl⽅式.下⾯将介绍这三种⽅法.
web⽅式
下⾯这个是⽤gofastdfs创建的⼀个图⽚资源库,⾄于怎么⽤gofastdfs创建我也没接触.接触后再补充.
upload后
终端curl⽅式
需要output = json,才能得到返回的数据.
如果想在代码调⽤终端命令
但你要获取返回的json,你需要popen.看这篇,这⼀步我没试过.
libcurl⽅式
⼀开始要验证libcurl是否正常,那么我可以创建⼀个http1.c⽂件,然后gcc http1.c -o http1 -l curl 验证⼀下.
#include<stdio.h>
#include<curl/curl.h>
#include<stdlib.h>
int main(int argc,char*argv[])
{
CURL *curl;//定义CURL类型的指针
CURLcode res;//定义CURLcode类型的变量,保存返回状态码
if(argc!=2)
{
printf("Usage : file <url>;/n");
exit(1);
}
curl =curl_easy_init();//初始化⼀个CURL类型的指针
if(curl!=NULL)
{
//设置curl选项. 其中CURLOPT_URL是让⽤户指定url. argv[1]中存放的命令⾏传进来的⽹址
curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
//调⽤curl_easy_perform 执⾏我们的设置.并进⾏相关的操作. 在这⾥只在屏幕上显⽰出来.
res =curl_easy_perform(curl);
//清除curl操作.
curl_easy_cleanup(curl);
}
return0;
}
post上传图⽚代码():
#include<iostream>
#include<curl/curl.h>
#include<string.h>
using namespace std;
//回调函数得到响应内容
int write_data(void* buffer,int size,int nmemb,void* userp){
std::string * str =dynamic_cast<std::string *>((std::string *)userp);
str->append((char*)buffer, size * nmemb);
return nmemb;
}
int upload(string url, string &body, string* response);
int main(int argc,char** argv){
std::string body;
std::string response;
int status_code =upload("172.28.28.17:80/files/deviceupload", body,&response);
if(status_code != CURLcode::CURLE_OK){
return-1;
}
cout << body << endl;
cout << response << endl;
return0;
}
int upload(string url, string &body, string* response)
{
CURL *curl;
CURLcode ret;
curl =curl_easy_init();
struct curl_httppost* post =NULL;
struct curl_httppost* last =NULL;
if(curl)
{
curl_easy_setopt(curl, CURLOPT_URL,(char*)url.c_str());//指定url
curl_formadd(&post,&last, CURLFORM_PTRNAME,"path", CURLFORM_PTRCONTENTS,"device_cover", CURLFORM_END);//form-data key(path)和 value(device_cover)
curl_formadd(&post,&last, CURLFORM_PTRNAME,"file", CURLFORM_FILE,"./test.jpg",CURLFORM_FILENAME,"hello.jpg", CURLFORM_END);// form-data key(file) "./test.jpg"为⽂件路径 "hello.jpg" 为⽂件上传时⽂件名
curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);//构造post参数
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);//绑定相应
curl_easy_setopt(curl, CURLOPT_WRITEDATA,(void*)response);//绑定响应内容的地址
ret =curl_easy_perform(curl);//执⾏请求
if(ret ==0){
curl_easy_cleanup(curl);
return0;
}
else{
return ret;
}
}
else{
return-1;
}
}
//提醒:对于CURLFORM_FILE和CURLFORM_FILENAME,要传c⾥⾯的字符串,所以c++ string要c_str()才⾏.
上传完,我们可以通过获取response,拿到返回的结果
因为服务器和gofastdfs是两个不⼀样的东西,所以我还需要将返回的数据再⽤http以post形式的json格式传回给服务器() // libcurlPostJson.cpp : Defines the entry point for the console application.
//
#include"stdafx.h"
#include<iostream>
#include<sstream>
//json
#include"json/json.h"
using namespace std;
//blog.csdn/wyansai/article/details/50764315
wstring AsciiToUnicode(const string& str)
{
// 预算-缓冲区中宽字节的长度
int unicodeLen =MultiByteToWideChar(CP_ACP,0, str.c_str(),-1,nullptr,0);
// 给指向缓冲区的指针变量分配内存
wchar_t*pUnicode =(wchar_t*)malloc(sizeof(wchar_t)*unicodeLen);
// 开始向缓冲区转换字节
MultiByteToWideChar(CP_ACP,0, str.c_str(),-1, pUnicode, unicodeLen);
wstring ret_str = pUnicode;
free(pUnicode);
return ret_str;
}
string UnicodeToUtf8(const wstring& wstr)
{
/
/ 预算-缓冲区中多字节的长度
int ansiiLen =WideCharToMultiByte(CP_UTF8,0, wstr.c_str(),-1,nullptr,0,nullptr,nullptr);
// 给指向缓冲区的指针变量分配内存
char*pAssii =(char*)malloc(sizeof(char)*ansiiLen);
// 开始向缓冲区转换字节
WideCharToMultiByte(CP_UTF8,0, wstr.c_str(),-1, pAssii, ansiiLen,nullptr,nullptr);
string ret_str = pAssii;
free(pAssii);
return ret_str;
}
string AsciiToUtf8(const string& str)
{
return UnicodeToUtf8(AsciiToUnicode(str));
}
size_t write_data(void*ptr, size_t size, size_t nmemb,void*stream)
curl是什么命令{
string data((const char*)ptr,(size_t)size * nmemb);
string data((const char*)ptr,(size_t)size * nmemb);
*((stringstream*)stream)<< data << endl;
return size * nmemb;
}
//POST json
int main()
{
CURL *curl;
CURLcode res;
char tmp_str[256]={0};
std::stringstream out;
//HTTP报⽂头
struct curl_slist* headers =NULL;
char*url ="localhost:10098/inbound/test/getTestInfo";
curl =curl_easy_init();
if(curl)
{
//构建json
Json::Value item;
item["mobile"]= Json::Value("weidong0925@126");
item["pageNo"]= Json::Value("梅西&内马尔&苏亚雷斯.txt");
std::string jsonout = StyledString();
jsonout =AsciiToUtf8(jsonout);
printf("Echo:\t request:\t %s", jsonout.c_str());
//设置url
curl_easy_setopt(curl, CURLOPT_URL, url);
//设置http发送的内容类型为JSON
/
/构建HTTP报⽂头
sprintf_s(tmp_str,"Content-Length: %s", jsonout.c_str());
headers =curl_slist_append(headers,"Content-Type:application/json;charset=UTF-8"); //headers=curl_slist_append(headers, tmp_str);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
//curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");//⾃定义请求⽅式curl_easy_setopt(curl, CURLOPT_POST,1);//设置为⾮0表⽰本次操作为POST // 设置要POST的JSON数据
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonout.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, jsonout.size());
// 设置接收数据的处理函数和存放变量
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);//设置回调函数
curl_easy_setopt(curl, CURLOPT_WRITEDATA,&out);//设置写数据
res =curl_easy_perform(curl);//执⾏
string str_json = out.str(); //清空stringstream的状态
printf("Echo: \t response: \t %s", str_json.c_str());
/* always cleanup */
curl_easy_cleanup(curl);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论