c++打开服务器文件,用C++给HTTP服务器发送一个文件解决方案

用C++给HTTP服务器发送一个文件

大家好,我想用C++给远端的HTTP服务器发送一个文件,该文件是一个Linux或者文件系统的压缩包,不是纯粹的文本文件。该怎么实现啊?希望得到高人的指点。

我现在手头有一个Web版,通过该网页,选择本地文件,然后提交给远端的Web服务器,缺点是这个网页一次只能传给一个Web服务器要传送的文件。

我想用C++自己 写一个,然后可以实现批量传送文件给多台远端的Web服务器。

下面是我在用网页进行升级的时候用Fiddler抓的一个包:

195333193.png

希望得到高人的指点,不胜感激。

权限不够,本来应该给更多分的,现在只能给我权限所能给的最高分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> &parameters,

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 的应用层协议

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值