用C++给HTTP服务器发送一个文件
大家好,我想用C++给远端的HTTP服务器发送一个文件,该文件是一个Linux或者文件系统的压缩包,不是纯粹的文本文件。该怎么实现啊?希望得到高人的指点。
我现在手头有一个Web版,通过该网页,选择本地文件,然后提交给远端的Web服务器,缺点是这个网页一次只能传给一个Web服务器要传送的文件。
我想用C++自己 写一个,然后可以实现批量传送文件给多台远端的Web服务器。
下面是我在用网页进行升级的时候用Fiddler抓的一个包:
希望得到高人的指点,不胜感激。
权限不够,本来应该给更多分的,现在只能给我权限所能给的最高分100了。
------解决方案--------------------
文件头的带有后面需要发送数据的大小的!
但是看你的发送的大小好像有问题,一次也太大了点吧!
一次需要发这么数据么?
还有用抓包工具看到的乱码是正常的!因为不一定就是简单字符串嘛!
可能是你自己定的某种协议(结构体拉,或者自己压缩拉,也可能是加密拉!)
发送过去,服务器对应解析就过来看数否是有效数据就好!
------解决方案--------------------
libcurl 上传文件,不管文件什么格式
libcurl开发指南
------解决方案--------------------
就是用普通的socket建立连接,有http的封装库更好。头里设置一下一共多少字节,本次传送多少字节等信息。通过你查到的包,就能分析出传送的http头应该怎么写了。
然后fopen打开文件,fread读一段,就send一段,然后就完事了啊。要支持断点续传的话,就用个配置文件记录下当前的进度,下次传就fseek到这个点开始传。
批量传送的话,要么开多个线程一起送,要么就排成队,一个一个发送。
------解决方案--------------------
传输的是数据,数据是字符还是非字符全看应用。
任何数据都可以组织成字节数组
------解决方案--------------------
引用:Quote: 引用:就是用普通的socket建立连接,有http的封装库更好。头里设置一下一共多少字节,本次传送多少字节等信息。通过你查到的包,就能分析出传送的http头应该怎么写了。
然后fopen打开文件,fread读一段,就send一段,然后就完事了啊。要支持断点续传的话,就用个配置文件记录下当前的进度,下次传就fseek到这个点开始传。
批量传送的话,要么开多个线程一起送,要么就排成队,一个一个发送。
前辈,我觉得您这个思想挺好的,您的意思是对于二进制文件,用fopen按照二进制的方式读出文件内的内容,然后分批发出去。我有个疑问,就是当我把二进制数据读出来的时候是怎么放进要发送的数组的,是每个二进制bit占一个char吗?然后发送二进制数据的字符数组。是这样不?
读出来的char数组直接发送就行了,char本质就是一个字节的内存,里面就是二进制数据。另一端收到后,直接fwrite把这个char数组,写到文件中就行了。
------解决方案--------------------
如果自己用socket发,借你一段封body的程序,自己改改。
bool URLRequestHandler::GenerateRequestBody(const std::map<: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::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;
}
------解决方案--------------------
直接用 tcp 吧
http 本身就是 tcp 的应用层协议