用C++给HTTP服务器发送一个文件
大家好,我想用C++给远端的HTTP服务器发送一个文件,该文件是一个Linux或者文件系统的压缩包,不是纯粹的文本文件。该怎么实现啊?希望得到高人的指点。
我现在手头有一个Web版,通过该网页,选择本地文件,然后提交给远端的Web服务器,缺点是这个网页一次只能传给一个Web服务器要传送的文件。
我想用C++自己 写一个,然后可以实现批量传送文件给多台远端的Web服务器。
下面是我在用网页进行升级的时候用Fiddler抓的一个包:
希望得到高人的指点,不胜感激。
权限不够,本来应该给更多分的,现在只能给我权限所能给的最高分100了。
[解决办法]
文件头的带有后面需要发送数据的大小的!
但是看你的发送的大小好像有问题,一次也太大了点吧!
一次需要发这么数据么?
还有用抓包工具看到的乱码是正常的!因为不一定就是简单字符串嘛!
可能是你自己定的某种协议(结构体拉,或者自己压缩拉,也可能是加密拉!)
发送过去,服务器对应解析就过来看数否是有效数据就好!
[解决办法]
libcurl 上传文件,不管文件什么格式
libcurl开发指南
[解决办法]
就是用普通的socket建立连接,有http的封装库更好。头里设置一下一共多少字节,本次传送多少字节等信息。通过你查到的包,就能分析出传送的http头应该怎么写了。
然后fopen打开文件,fread读一段,就send一段,然后就完事了啊。要支持断点续传的话,就用个配置文件记录下当前的进度,下次传就fseek到这个点开始传。
批量传送的话,要么开多个线程一起送,要么就排成队,一个一个发送。
[解决办法]
传输的是数据,数据是字符还是非字符全看应用。
任何数据都可以组织成字节数组
[解决办法]
bool URLRequestHandler::GenerateRequestBody(const std::map<std::wstring, std::wstring> ¶meters,
const std::string &upload_contents,
const std::wstring &file_name,
const std::wstring &file_part_name,
const std::string &boundary_str,
std::string *request_body)
{
if (boundary_str.empty()) {
return false;
}
request_body->clear();
// Append each of the parameter pairs as a form-data part
for (map<wstring, wstring>::const_iterator pos = parameters.begin();
pos != parameters.end(); ++pos) {
request_body->append("--" + boundary_str + "\r\n");
request_body->append("Content-Disposition: form-data; name="" +
base::SysWideToUTF8(pos->first) + ""\r\n\r\n" +
base::SysWideToUTF8(pos->second) + "\r\n");
}
// Now append the upload file as a binary (octet-stream) part
string filename_utf8 = base::SysWideToUTF8(file_name);
if (filename_utf8.empty()) {
return false;
}
string file_part_name_utf8 = base::SysWideToUTF8(file_part_name);
if (file_part_name_utf8.empty()) {
return false;
}
request_body->append("--" + boundary_str + "\r\n");
request_body->append("Content-Disposition: form-data; "
"name="" + file_part_name_utf8 + ""; "
"filename="" + filename_utf8 + ""\r\n");
request_body->append("Content-Type: application/octet-stream\r\n");
request_body->append("\r\n");
if (!upload_contents.empty()) {
request_body->append(upload_contents);
}
request_body->append("\r\n");
request_body->append("--" + boundary_str + "--\r\n");
return true;
}