天天看点

【LibCurl】关于使用curl_formadd中CURLFORM_FILE标签使用路径上传文件的问题【LibCurl】关于使用curl_formadd中CURLFORM_FILE标签使用路径上传文件的问题

【LibCurl】关于使用curl_formadd中CURLFORM_FILE标签使用路径上传文件的问题

问题:使用string类型的参数会导致函数在特定条件下无法获取string值

所使用的代码如下:

// 定义的string
string route = "image";
string filename = "Color.png";
//省去curl其它声明
//需要使用form-data的形式传输图片,这些内容在请求头里可以定义好
...
//往post请求里加入图片
curl_formadd(&post, &last,
			CURLFORM_PTRNAME, "ColorPic",
			CURLFORM_FILE, route + "\\"  + filename,
			CURLFORM_END);
//剩下内容省略
...
           

一旦这样写入,则请求无法被提交。

但是这样写入,请求又不会有问题:

//省去curl其它声明
//需要使用form-data的形式传输图片,这些内容在请求头里可以定义好
...
//往post请求里加入图片
curl_formadd(&post, &last,
			CURLFORM_PTRNAME, "ColorPic",
			CURLFORM_FILE, "image\\Color.png",
			CURLFORM_END);
//剩下内容省略
...
           

很显然,在很多时候上传图片需要通过程序内部的参数来定义,我不会知道图片的名字是啥。所以通过在函数内写字符串的形式肯定行不通。

于是我试着加了几个断点用于debug,然后发现:

【LibCurl】关于使用curl_formadd中CURLFORM_FILE标签使用路径上传文件的问题【LibCurl】关于使用curl_formadd中CURLFORM_FILE标签使用路径上传文件的问题

这里似乎并没有我定义的字符串的内容啊?而且该参数的格式是char*而不是string。

发现问题之后,开始着手考虑解决。于是我将整个字符串转换为char*的形式:

// 定义的string
string route = "image";
string filename = "Color.png";
//省去curl其它声明
//需要使用form-data的形式传输图片,这些内容在请求头里可以定义好
...
//往post请求里加入图片
curl_formadd(&post, &last,
			CURLFORM_PTRNAME, "ColorPic",
			//在这里做了改动
			CURLFORM_FILE, (route + "\\"  + filename).c_str(),
			CURLFORM_END);
//剩下内容省略
...
           

好了,这样一来,请求可以被正常上传了:

【LibCurl】关于使用curl_formadd中CURLFORM_FILE标签使用路径上传文件的问题【LibCurl】关于使用curl_formadd中CURLFORM_FILE标签使用路径上传文件的问题

总结:

写代码碰到无法预测的问题时一定要debug,看看参数到底是怎么回事。

同时我得加强一下C++基础的学习了。