http 协议大文件下载

这篇具有很好参考价值的文章主要介绍了http 协议大文件下载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        http 协议的响应报文格式包括起始行+头部字段+响应正文,其格式为:

/*严格按照http应答头格式进行填写:如果有正文,需要在头部字段里写明

** 协议版本|空格|状态码|空格|状态码描述|回车|换行
** 头部字段名|冒号|字段值|回车|换行
** 头部字段名|冒号|字段值|回车|换行
** 头部字段名|冒号|字段值|回车|换行
** .....
** 回车|换行
** 响应正文

*/

        响应的正文只能通过http响应消息进行传输,如果是小文件(比如小于1M)传输,则没有什么问题,直接把文件内容加载到正文进行回应即可,但如果是大文件(比如大于10M),不可能把文件内容加载到正文吧,如果更大的文件呢,100M?

        http 协议的 Transfer-Encoding: chunked 传输方式可以解决文件大小未知的情况(大文件我们也可以当作其大小未知来处理),客户端支持 chunked 传输的情况下,会将服务端发送过来的 n 个 chunked 进行重组,最后形成文件,这种传输方式有格式限制,假如出错的话,客户端可能会一直等待(因为它不知道什么时候结束),其格式如下:

/* chunked 传输方式格式

** 协议版本|空格|状态码|空格|状态码描述|回车|换行
** 头部字段名|冒号|字段值|回车|换行
** 头部字段名|冒号|字段值|回车|换行
** 头部字段名|冒号|字段值|回车|换行
** 
** n1大小|换行
** 响应正文
**
** n2大小|换行
** 响应正文
**
** n2大小|换行
** 响应正文
**
** 0|换行
*/

更形象如下:

http 协议大文件下载

需要注意:响应头只需要一条,而 chunked 则可以是多条,看你将文件分为多少块了,响应头必须要有 "Transfer-Encoding: chunked"。

那用c++代码怎么写呢?主要代码片段如下:

//处理大文件,采用分块传输的方式
std::string headers;
headers.append("HTTP/1.1 200 ok").append("\r\n");
response.getHead(headers);
headers.append("Content-Type: application/octet-stream").append("\r\n");
headers.append("Transfer-Encoding: chunked").append("\r\n").append("\r\n");

mg_send(connection, headers.c_str(), headers.length());
tracef("giant file send header: %s\n", headers.c_str());

sendGiantFile(connection, fileName.c_str());

 最主要就是下面这个函数:

void sendGiantFile(struct mg_connection *connection, const char *fileName)
{
    size_t fileLen = 0;
    int readLen = 0;
    char buf[4096] = {0};
    FILE *fp = fopen(fileName, "r");
    fseek(fp, 0, SEEK_END);
    fileLen = ftell(fp);
    rewind(fp);

    while(fileLen > 0)
    {   
        readLen = fread(buf, 1, sizeof(buf), fp);
        mg_send_http_chunk(connection, buf, readLen);
        fileLen -= readLen;
    }

    fclose(fp);

    //最后0结尾
    tracef("send tail 0 chunked\n");
    mg_send_http_chunk(connection, "", 0);
}

当发送响应头之后 ,用一个 while 循环进行文件块的发送,每次发送大小自行决定,这里用到的是mongoose 里的接口 mg_send_http_chunk() 函数,最后发送一个0及\r\n 表示 chunk 传输结束。其实际效果为:

http 协议大文件下载

下载一个 19 M 的文件是可以成功的,再大的文件没有试,因为下载速度有点慢。那下载下来的文件是否有异常呢?我们可以看一下原文件和下载的文件经过 md5 编码是否一样就可以了。

原文件 md5 码:

http 协议大文件下载

 设备上已经有 md5sum 命令,直接使用了。

下载文件的 md5 码:

http 协议大文件下载

windows上下载的,所以把这个文件拷贝到 CentOS 服务上看一下了,这两个文件经过 md5sum 后值是一样的,那我们下载的文件就是正常的。

http 协议大文件下载文章来源地址https://www.toymoban.com/news/detail-488008.html

到了这里,关于http 协议大文件下载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HTTP 和 HTTPS(请求响应报文格式 + 请求方法 + 响应状态码 + HTTPS 加密流程 + Cookie 和 Session)

    HTTP 全称 “ 超文本传输协议 ”,是一种基于传输层 TCP 协议实现的应用非常广泛的 应用层协议 我们平时打开一个网站,就是通过 HTTP 协议来传输数据的 当我们在浏览器中访问一个 “ 网址 ”(URL),浏览器就会给这个 URL 的服务器发送一个 HTTP 请求,服务器返回一个 HTTP 响

    2023年04月19日
    浏览(34)
  • 2.5 - 网络协议 - HTTP协议工作原理,报文格式,抓包实战

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 HTTP(Hypertext Transfer Protocol)是 「超文本传输协议」 ,基于B/S架构(Browser

    2024年02月05日
    浏览(32)
  • 计算机网络 - 应用层http协议 - http报文格式介绍(1)

    本篇认识和理解应用层中的http协议,了解抓包工具并进行使用,认识请求报文与响应报文,了解报文中基本键值对意思例如:Set-Cookie, 状态码等,如有错误,请在评论区指正,让我们一起交流,共同进步! 本文开始 ① 根据输入的url,在域名系统DNS中进行解析获取对应的服务

    2024年02月12日
    浏览(35)
  • 文件下载 response响应ContentType与a标签download属性

    我们在进行文件下载的时候,后端往往需要通过如下方式设置ContentType,其中用到了MediaType,MediaType是一种媒体类型,指定资源的形式。

    2024年02月02日
    浏览(32)
  • 后端接口返回文件流格式、前端如何实现文件下载导出呢?

    在项目开发过程中,难免会需要实现文件下载功能,记录下自己实际开发过程过程中遇到两种实现的方式。一种:后端直接返回加密url ,前端解密后直接使用 a标签下载就可以,这种方法相等比较简单,另一种:后端接口直接返回文件流,这种方式前端就需要单独封装对应的

    2024年02月16日
    浏览(36)
  • JAVA Http接口获取文件下载流,将下载的文件上传阿里云

     需要根据,业务数据,将存在第三方平台的数据,下载至本地,或转存阿里云OSS中。

    2024年02月16日
    浏览(30)
  • 前端用原生js编辑文件内容→创建生成文件(格式可以自定义)→下载文件

    会自动创建一个html文件    前端实现下载文件的两种方法downloadFile_文件下载downloadfile_你挚爱的强哥的博客-CSDN博客 实现效果如上图。_文件下载downloadfile https://blog.csdn.net/qq_37860634/article/details/131022008 通过整合以上两个方法,合并为一个方法: 特性: 实现自主编写文件生成并

    2024年02月12日
    浏览(39)
  • 【四、http】go的http的文件下载

    这里以一张图片为例子 从后台可以看到图片的url地址 修改main函数中的url地址,可以下载到本地 结果如下 io.copy函数实现原理 从中可以看出, io.copy 函数是通过read读取文件进行写入新创建的文件,因此,重写后的 read 函数除了实现原来的 read 功能,还增加了进度条功能。

    2024年02月04日
    浏览(22)
  • http实现文件分片下载

    HTTP分片异步下载是一种下载文件的技术,它允许将一个大文件分成多个小块(分片),然后分别下载这些分片,从而实现更快速、稳定的下载过程。这种技术常用于大文件的下载,例如视频、游戏、软件等。或者与文件下载的断点续传功能搭配使用时非常有用。 比如当你正

    2024年02月08日
    浏览(52)
  • Qt下载http文件

    这是一个有问题的版本:  当要下载的文件过大时,程序会崩溃!!!(std::bad_alloc)(所以只可以下载一些小的文件) 我认为这是ba(QByteArray)太大了,要一下子往文件中写入太多的数据,导致new失败了。 修复: Qt 基于http的网络文件下载_qt http下载文件-CSDN博客(参考+引用)

    2024年01月18日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包