delphi压缩后使用http协议base64上传下载6G超大文件
注:服务端软件,使用高勇出品GYRestServer系列。欢迎使用,加QQ群咨询:174483085
一、知识点:
1、Delphi自带的压缩解压单元system.zlib.pas中核心函数的使用
2、服务端http协议ContentType(mime-type)相关列表类型的注册
3、Base64编码的规则
4、为何要分块断点续传,并使用TFileStream文件流替代内存流TMemoryStream
5、Buffer.size对Base64分块断点续传的影响
6、优化上传下载的速度与并发性能的综合考虑
二、直接看视频了解核心关键内容
从本博客资源下载:
链接: https://pan.baidu.com/s/1Zpxfe5fJruuJW68x3dDTSw
提取码:iqvo
三、其它的补充说明
3.1、优化上传下载的速度与并发性能的综合考虑
参考本博客博文:
浅谈服务器http并发数的影响因素_pulledup的博客-CSDN博客https://blog.csdn.net/pulledup/article/details/121383350
3.2、服务端http协议ContentType(mime-type)相关列表类型的注册
参考本博客博文:
delphi MimeType for Restful及delphi mime-type和文件扩展名对照表_pulledup的博客-CSDN博客delphi MimeType for Restful MimeType是你让编写的应用Restful化编程所必须的。delphi支持哪些MimeType,如何知道这些MimeType与文件扩展名的对应关系,以及它们是文本种类、二进制种类还是未定义的。一、先上代码 : 已附上面源码下载。由于代码引用了跨平台的文件存取,使用源码注意事项:1、在FormCre...https://blog.csdn.net/pulledup/article/details/105774767delphi XE应用Restful时Rest组件的delphi XE ContentType即delphi XE mime type怎样获取和表达_pulledup的博客-CSDN博客delphi XE应用Restful时Rest组件的delphi XE ContentType即delphi XE mime type怎样获取和表达一、usesREST.Types;//var //DefaultRESTRequestParameterKind: TRESTRequestParameterKind = TRESTRequestParameterKind.pkGETor...https://blog.csdn.net/pulledup/article/details/105749158
3.3、Buffer.size对Base64分块断点续传的影响
为何使用Base64?
如果你仅仅是上传下载,而无需下载后H5加载,可以不必非得使用TBase64Encoding来编解码。可参考本博客博文:
否则,请使用Base64,它可以对html和URL进行编解码。请直接使用高勇出品GYRestServer系列及其配套客户端GYRestClient.pas中的相关代码进行客制化。
Base64内容传输时需要注意的事项:
//http分块上传或下载时,需注意:
block := (6*25)*7 * 1024 * 1;//=1050KB
//:来超2021-11-19:提升服务器并发性能:拷贝分块大小,delphi默认32kb
//block := 1024 * 1024 * 1;//:拷贝分块大小,每次拷贝1M:
//:(一次上传,最多不能超过25M,似乎超过了,就没有响应)
//:Buffer不正确会对Base64分段产生无规律的不可预期的影响:
//:Base64----4组每组6位编码----块:6位字节的整数倍--以替换8位1组的二进制
//:W3C标准: https://datatracker.ietf.org/doc/html/rfc2045
//:delphi默认buffer.size=32k,太小了:
//:1.1、客户会感觉太慢了
//:1.2、某些服务器也可能做了限制:不允许连续发小包给它,它人为你是在http攻击
//:buffer.size=N个KB,太大了:
//:2.1、客户端内存不允许:上限好像是忘了65535KB? 32768KB? 总之最好不要超过1M
//:2.1、服务器并发时,
//:内存(取决于服务器内存的大小)
//:磁盘(取决服务器硬盘通道即单位时间IO速度)、
//:网路带宽(取决你服务器的带宽)
//:它们受不了大的“冲击波"
Base64 内容传输的W3C标准说明:
3.4、为何需使用TFileStream文件流替代内存流TMemoryStream
并发时,压缩解压也好、上传下载也好,或使用内存流TMemoryStream,内存的开销太大、而且内存很昂贵,使用文件流TFileStream替代内存流,会有效避免此问题。
用Delphi自带的system.zlib.pas库单元函数压缩解压时,要特别注意:
3.4.1、必要期待你能用常用的压缩解压工具,去打开system.zlib压缩文件,因为它是Delphi专用的压缩格式,加了密的;不过这样也很安全;
3.4.2、无论压缩环节还是解压环节均不要TStream.CopyFrom
因为这样,会丢失字节。而应当老实的用字节数组,逐个字节的读取或写入。