使用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;
//}

  

c++使用http协议上传文件到七牛云服务器的更多相关文章

  1. 利用ThinkPHP自带的七牛云驱动上传文件到七牛云以及删除七牛云文件方法

    一.准备工作 1.注册七牛云账号 2.选择对象储存->创建空间->设置为公开 3.在config配置文件中添加以下代码 'UPLOAD_FILE_QINIU' => array ( ...

  2. RN 上传文件到以及上传文件到七牛云(初步)

    本文将介绍: 如何使用原生 Javascript 上传文件 如何使用七牛云 SDK 上传文件到七牛云 在 App 中文件上传是一个非常重要的需求,但是翻遍 React Naitve 的官方文档没有发现 ...

  3. SpringSpringBoot上传文件到七牛云

    准备工作 maven pom.xml添加七牛云的sdk依赖 <dependency> <groupId>com.qiniu</groupId> <artifa ...

  4. 使用Qiniu-JavaScript-SDK上传文件至七牛云存储

    一.Qiniu-JavaScript-SDK介绍 基于 JS-SDK 可以方便的从浏览器端上传文件至七牛云存储,并对上传成功后的图片进行丰富的数据处理操作. JS-SDK 兼容支持 H5 File A ...

  5. Laravel-admin 七牛云上传文件到七牛云出现卡顿失败情况

    由于所做项目需要管理后台众多,所以选择了Laravel-admin后台框架进行开发.节省了权限控制以及页面处理等问题的时间 Laravel-admin文档地址 http://laravel-admin ...

  6. laravel上传文件到七牛云存储

    背景 最近在用PHP和laravel框架做一个图片网站,需要将图片存贮到云端,搜索下了对比了下功能,发现七牛云存储不错(主要小流量免费),便选择使用七牛作为图片存储空间. 要实现的功能很简单,选择本地 ...

  7. java(SSM)上传文件到七牛云(对象存储)

    项目中会用到大量的图片和小视频,为了分担服务器压力,将文件都放在七牛云.这里的思路很简单, 就是移动端.pc端把文件上传到服务器,服务器做一个临时缓存,保存必要的信息到数据库后, 将文件上传到七牛云, ...

  8. 使用python3.7+Vue.js2.0+Django2.0.4异步前端通过api上传文件到七牛云云端存储

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_130 之前一篇文章是通过普通js+tornado来上传七牛云:使用Tornado配合七牛云存储api来异步切分上传文件,本次使用v ...

  9. 记一次上传文件到七牛云存储的经历(Plupload & UEditor)(.net)

    七牛 配置ACCESS_KEY和SECRET_KEY Qiniu.Conf.Config.ACCESS_KEY = "ACCESS_KEY"; Qiniu.Conf.Config. ...

随机推荐

  1. how can i get the source code path && file names from an ELF file(compired with -g)?

    https://stackoverflow.com/questions/31333337/how-can-i-get-the-source-code-path-file-names-from-an-e ...

  2. iOS 和服务端交互 数据加密策略

    总体逻辑: 客户端:对称加密数据,上传...回执对称解密 同理服务端:获取上传数据 对称解密 ...下发:对称加密 当且仅当登录接口和 拉新(更新nonce 和 key的接口)是对称加密上传 非对称解 ...

  3. ResulsetHandler九个实现类

    ResulsetHandler九个实现类 ArrayHandler, 将结果集中第一条记录封装到Object[],数组中的每一个元素就是记录中的字段值. ArrayListHandler, 将结果集中 ...

  4. MongoDB快速入门(十一)- sort() 方法

    sort() 方法 要在 MongoDB 中的文档进行排序,需要使用sort()方法. sort() 方法接受一个文档,其中包含的字段列表连同他们的排序顺序.要指定排序顺序1和-1. 1用于升序排列, ...

  5. Window修改git-bash默认路径

    每次打开git-bash都默认到c盘,解决办法:修改git-bash的快捷方式 1. 删除目录后面的 --cd-to-home 2. 修改起始位置路径为你的项目路径 3. 还可以设置一个快捷键,在任何 ...

  6. scala mapPartitionsWithIndex函数的使用

    var rdd1=sc.makeRDD(Array((1,"A"),(2,"B"),(3,"C"),(4,"D")),2 ...

  7. 为什么Kubernetes不使用libnetwork

    Kubernetes 在 1.0 版本之前就已经有了最初的网络插件.与此同时 Docker 也引入了 libnetwork 和 Container Network Model (CNM).现在 Doc ...

  8. angularjs地址栏传参

    1:路由定义参数 2.controller 3. 4.目标得到参数值

  9. aps.net session全面介绍(生命周期,超时时间)

    Asp.Net中的Session与Cookie最大的区别在于:Cookie信息全部存放于客户端,Session则只是将一个ID存放在客户端做为与服务端验证的标记,而真正的数据都是放在服务端的内存之中的 ...

  10. debug.js中的length的错误

    记得昨天报了一个错,debug.js文件中的length未定义.前台不定位代码,后天也不报错,而debug.js是框架封装的文件,不是自己写的,无从得知是哪里的问题,而项目也已经重新启动过,无法撤销. ...