c++使用http协议上传文件到七牛云服务器

使用c++ http协议上传文件到七牛服务器时,比较搞的一点就是header的设置:

"Content-Type:multipart/form-data;boundary=xxx"

 

// HttpUpload.h 
#include "cocos2d.h"

#include "network/HttpClient.h"
using namespace cocos2d;
using namespace std;

class uploadFile
{
public:
	static uploadFile *m_inst;
	static uploadFile *GetInst();

	void UpLoadFile(string photoPath,string key,string token);

	void onHttpRequestCompleted(network::HttpClient* client, network::HttpResponse* response);

//	static size_t write_data(uint8_t *dataBack, size_t size, size_t nmemb, void *userp);
};


/  HttpUpload.cpp   
#include "HttpUpload.h"    

uploadFile* uploadFile::m_inst = NULL;

uploadFile* uploadFile::GetInst()
{
	if (!m_inst)
	{
		m_inst = new uploadFile();
		return m_inst;
	}
	return NULL;
}




void uploadFile::onHttpRequestCompleted(network::HttpClient* client, network::HttpResponse* response)
{
    int result = 0;
	if (!response->isSucceed())
	{
		
		CCLOG("error");
		CCLOG("error buffer: %s", response->getErrorBuffer());
		CCLOG("error code: %d", (int)response->getResponseCode());

		//CCLOG("resp: %s", response->getResponseData());
		
		std::vector<char> *buffer = response->getResponseData();
		std::string errMsg = "";
		for (vector<char>::iterator iter = buffer->begin(); iter != buffer->end(); ++iter)
		{
			errMsg += *iter;
		}
		CCLOG("errMsg: %s",errMsg.c_str());
	}
    else
    {
        result = 1;
        CCLOG("upload success");
//        std::vector<char>* buffer = response->getResponseData();
//        std::vector<char>* header = response->getResponseHeader();
//        auto data = std::string(buffer->begin(), buffer->end());
//        auto headerData = std::string(header->begin(), header->end());
//        CCLOG("responseData %s", data.c_str());
//        CCLOG("responseHeader %s", headerData.c_str());
    }
    EventCustom event("upload_result");
    event.setUserData(&result);
    Director::getInstance()->getEventDispatcher()->dispatchEvent(&event);
    
};

void uploadFile::UpLoadFile(string photoPath,string key,string token)
{
	network::HttpClient* http = network::HttpClient::getInstance();
	network::HttpRequest* req = new network::HttpRequest;
	req->setRequestType(network::HttpRequest::Type::POST);
	req->setUrl("http://up.qiniu.com");
	req->setResponseCallback(CC_CALLBACK_2(uploadFile::onHttpRequestCompleted, this));
    std::string pathKey = photoPath;

	Data imgdata = FileUtils::getInstance()->getDataFromFile(pathKey);
//	long buff = 0;
//	unsigned char * pBuffer = FileUtils::sharedFileUtils()->getFileData(pathKey.c_str(), "rb", &buff);
//	const char* fileBinary = (const char*)pBuffer;
//	std::string strBin = std::string(fileBinary, buff);
    
    cocos2d:Data fileData = FileUtils::getInstance()->getDataFromFile(pathKey);
    std::string strBin = std::string((const char*)fileData.getBytes(), fileData.getSize());

	std::string boundary = "----------------WebKitFormBou3123ndaryEm5WNw6hGiQUBpng";
	std::vector<std::string> headers;
	headers.push_back("Content-Type:multipart/form-data;boundary=" + boundary);
	req->setHeaders(headers);

	std::string str = "";

	// token
	str += "\r\n";
	str += "--" + boundary;
	str += "\r\n";
	str += "Content-Disposition:form-data; name=\"token\"";
	str += "\r\n\r\n";
    str += token;
	str += "\r\n";

	// key
	str += "--" + boundary;
	str += "\r\n";
	str += "Content-Disposition:form-data; name=\"key\"";
	str += "\r\n\r\n";
	str += key;
	
	std::string strdata = strBin;
	str += "\r\n--" + boundary + "\r\n";
	str = str + "Content-Disposition:form-data; name=\"file\"; filename=\"" + key + "\"\r\n";
	str = str + "Content-Type:application/octet-stream\r\n";
	str = str + "Content-Transfer-Encoding: binary\r\n\r\n";
	str = str + strBin;
	str = str + "\r\n--" + boundary + "--\r\n";
	
	
	req->setRequestData(str.data(), str.size());


	CCLOG("req data:%s", req->getRequestData());
	CCLOG("str data = %s \n str .size = %lu \n", str.data(), str.size());


	http->send(req);

	req->release();


}


//size_t uploadFile::write_data(uint8_t *dataBack, size_t size, size_t nmemb, void *user_p)
//{
//	string szData = string((char*)dataBack);
//
//	return 0;
//}


    

  

转载于:https://www.cnblogs.com/JD85/p/8455205.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要在你的 Vue 项目中安装 `qiniu-js` 包,这个包可以帮助你将文件到七牛云。 安装命令:`npm install qiniu-js` 然后,在你的 Vue 组件中引入 `qiniu-js` 包,代码如下: ``` import * as qiniu from 'qiniu-js' ``` 接下来,我们需要实现异步上文件到七牛云的功能。假设我们已经有一个上文件的方法 `handleUpload`,代码如下: ``` handleUpload(file) { const token = 'your-qiniu-upload-token' // 替换成你的七牛云上凭证 const key = file.name // 文件名作为七牛云存储的文件名 const config = { useCdnDomain: true, // 是否使用七牛云的 CDN 域名 } const putExtra = { fname: file.name, // 文件原始名字 params: {}, // 上额外参数 mimeType: null // 上文件类型 } const observable = qiniu.upload(file, key, token, putExtra, config) const observer = { next(res) { // 上进度回调 console.log(res.total.percent) }, error(err) { // 上失败回调 console.log(err) }, complete(res) { // 上成功回调 console.log(res) } } const subscription = observable.subscribe(observer) // 执行上操作 } ``` 在上面的代码中,我们通过 `qiniu.upload` 方法来执行文件操作,参数依次为: - `file`: 要上文件对象 - `key`: 上到七牛云后的文件名 - `token`: 七牛云上凭证 - `putExtra`: 上额外参数,包括文件名、上参数和文件类型 - `config`: 上配置,包括是否使用七牛云的 CDN 域名 在上过程中,我们通过观察者模式来监听上进度、上成功和上失败事件,并执行相应的回调函数。 最后,你可以在你的组件中调用 `handleUpload` 方法来上文件,例如: ``` <el-upload action="" :before-upload="handleUpload" > <el-button type="primary">点击上</el-button> </el-upload> ``` 在上面的代码中,我们使用了 Element UI 的上组件,并将 `before-upload` 属性设置为 `handleUpload` 方法,这样就可以触发文件操作了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值