大文件分块上传的代码,C++转delphi,由delphi实现。

        在 Delphi 中,我们通常使用 IdHTTPTNetHTTPClient 等组件来处理 HTTP 请求

原文章链接:

掌握分片上传:优化大文件传输的关键策略 【C++】【WinHttp】【curl】-CSDN博客

改造思路:

  1. 文件分块处理:使用 TFileStream 来读取和分割文件。
  2. HTTP 请求处理:使用 TNetHTTPClient 来发送 HTTP 请求。
  3. 多线程上传:使用 Delphi 的 TThread 类来实现多线程上传。

代码:

usesSystem.SysUtils, System.Classes, System.Net.URLClient, System.Net.HttpClient,System.Net.HttpClientComponent, System.Threading;constCHUNK_SIZE = 10 * 1024 * 1024; // 10 MBUPLOAD_URL = 'https://www.example.com/upload';MAX_THREADS = 4;typeTFileChunker = classpublicclass function SplitFileIntoChunks(const FilePath: string): TArray<TBytes>;end;TChunkUploader = classpublicclass procedure UploadChunk(const ChunkData: TBytes; ChunkNumber: Integer);end;class function TFileChunker.SplitFileIntoChunks(const FilePath: string): TArray<TBytes>;
varFileStream: TFileStream;RemainingSize, CurrentChunkSize: Int64;Buffer: TBytes;
beginFileStream := TFileStream.Create(FilePath, fmOpenRead or fmShareDenyWrite);trySetLength(Result, 0);RemainingSize := FileStream.Size;while RemainingSize > 0 dobeginCurrentChunkSize := Min(CHUNK_SIZE, RemainingSize);SetLength(Buffer, CurrentChunkSize);FileStream.ReadBuffer(Buffer[0], CurrentChunkSize);SetLength(Result, Length(Result) + 1);Result[High(Result)] := Buffer;RemainingSize := RemainingSize - CurrentChunkSize;end;finallyFileStream.Free;end;
end;class procedure TChunkUploader.UploadChunk(const ChunkData: TBytes; ChunkNumber: Integer);
varHttpClient: TNetHTTPClient;Response: IHTTPResponse;
beginHttpClient := TNetHTTPClient.Create(nil);try// 设置请求头部等HttpClient.ContentType := 'application/octet-stream';Response := HttpClient.Post(UPLOAD_URL, TStreamAdapter.Create(TBytesStream.Create(ChunkData), soOwned));// 检查响应等finallyHttpClient.Free;end;
end;procedure StartUpload(const Chunks: TArray<TBytes>);
varTaskArray: array of ITask;I: Integer;
beginSetLength(TaskArray, Length(Chunks));for I := 0 to High(Chunks) dobeginTaskArray[I] := TTask.Create(procedurebeginTChunkUploader.UploadChunk(Chunks[I], I);end);TaskArray[I].Start;end;// 等待所有任务完成TTask.WaitForAll(TaskArray);
end;varChunks: TArray<TBytes>;
begintryChunks := TFileChunker.SplitFileIntoChunks('path/to/your/largefile');StartUpload(Chunks);excepton E: Exception doWriteln(E.ClassName, ': ', E.Message);end;
end.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/227230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

适用于 Windows 和 Mac 的 10 款最佳照片恢复软件(免费和付费)

丢失照片很容易。这里点击错误&#xff0c;那里贴错标签的 SD 卡&#xff0c;然后噗的一声&#xff0c;一切都消失了。值得庆幸的是&#xff0c;在技术领域&#xff0c;你可以纠正一些错误。其中包括删除数据或格式化错误的存储设备。 那么&#xff0c;让我们看看可用于从 SD …

从memcpy()函数中学习函数的设计思想

memcpy()函数&#xff1a;可以理解为内存拷贝。 他的函数定义如下的 my_memcpy()函数相同。 下面这个函数是我的模拟实现&#xff0c;现在让我们一起来学习一下这个函数的设计思想&#xff1a; void * my_memcpy(void * des, const void* src, size_t size) {void * p des;…

Before an Exam

题目名字 Before an Exam 题目链接 题意 给定天数和目标&#xff0c;然后接下来输入每天的最少时间和最多时间&#xff0c;先判断在每天的范围内能否完成目标&#xff0c;如果不能输出no&#xff0c;如果能就输出每天在给定范围内完成的时间 思路 先用maxsum来将每天的最大时…

[c++]—vector类___提升版(带你了解vector底层的运用)

我写我 不论主谓宾 可以反复错 &#x1f308;vector的介绍 1.vector是表示可变大小数组的序列容器2.就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素&#xff0c;也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&…

工业性能CCD图像处理+

目录 硬件部分 ​编辑 软件部分 CCD新相机的调试处理&#xff08;更换相机处理&#xff0c;都要点执行检测来查看图像变化&#xff09; 问题:新相机拍摄出现黑屏&#xff0c;图像拍摄不清晰&#xff0c;&#xff08;可以点击图像&#xff0c;向下转动鼠标的滚轮&#xff08…

华为OD机试 - 符号运算(Java JS Python C)

题目描述 给定一个表达式,求其分数计算结果。 表达式的限制如下: 所有的输入数字皆为正整数(包括0)仅支持四则运算(+-*/)和括号结果为整数或分数,分数必须化为最简格式(比如6,3/4,7/8,90/7)除数可能为0,如果遇到这种情况,直接输出"ERROR"输入和最终计…

基于linux系统的Tomcat+Mysql+Jdk环境搭建(一)vmare centos7 设置静态ip和连接MobaXterm

特别注意&#xff0c;Windows10以上版本操作系统需要下载安装VMware Workstation Pro16及以上版本&#xff0c;安装方式此处略。 (可忽略 my*** 记录设置的vamare centos7 账号root/aaa 密码&#xff1a;Aa123456 ) 1、命令行和图形界面切换 如果使用的是VMware虚拟机&…

金智融门户(统一身份认证)同步数据至钉钉通讯录

前言:因全面使用金智融门户和数据资产平台,二十几个信息系统已实现统一身份认证和数据同步,目前单位使用的钉钉尚未同步组织机构和用户信息,职工入职、离职、调岗时都需要手工在钉钉后台操作,一是操作繁琐,二是钉钉通讯录更新不及时或经常遗漏,带来管理问题。通过金智融…

编写第一个Selenium脚本

目录 安装Selenium类库 请求对应的程序语言 Pip 下载 在项目中使用 编写第一个Selenium脚本 八个基本组成部分 1. 使用驱动实例开启会话 本地驱动 驱动自动管理 驱动选项 浏览器选项 Capabilities Timeouts 2. 在浏览器上执行操作 3. 请求 浏览器信息 4. 建立等…

CAD 审图意见的导出

看图的时候喜欢在图上直接标注意见&#xff0c;但是如果还要再把意见一行一行的导出到word里面就很麻烦&#xff0c;在网上看了一个审图软件&#xff0c;报价要980&#xff0c;而且那个审图意见做的太复杂了。 我的需求就是把图上标的单行文字和多行文字直接导出来就行&#x…

debug点f8step over会进入class文件

File->settings->Bulid.Executiong.Deployment->Debugger->Stepping 取消如图对钩即可

二十七、读写文件

二十七、读写文件 27.1 文件类QFile #include <QCoreApplication>#include<QFile> #include<QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QFile file("D:/main.txt");if(!file.open(QIODevice::WriteOnly | QIODe…

three.js模拟太阳系

地球的旋转轨迹目前设置为了圆形&#xff0c;效果&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div c…

illuminate/database 使用 五

之前文章&#xff1a; illuminate/database 使用 一-CSDN博客 illuminate/database 使用 二-CSDN博客 illuminate/database 使用 三-CSDN博客 illuminate/database 使用 四-CSDN博客 一、原生查询 1.1 原理 根据之前内容调用执行的静态类为Illuminate\Database\Capsule\M…

idea第一次提交到git(码云)

1.先创建一个仓库 2.将idea和仓库地址绑定 2.将idea和仓库地址绑定

CentOS 7系统加固详细方案SSH FTP MYSQL加固

一、删除后门账户 修改强口令 1、修改改密码长度需要编译login.defs文件 vi /etc/login.defs PASS_MIN_LEN 82、注释掉不需要的用户和用户组 或者 检查是否存在除root之外UID为0的用户 使用如下代码&#xff0c;对passwd文件进行检索&#xff1a; awk -F : ($30){print $1) …

Java中的锁策略

1 乐观锁 vs 悲观锁 锁的实现者预测当前锁冲突的概率&#xff0c;可分为乐观锁和悲观锁。 乐观锁&#xff1a;发生冲突的概率较小&#xff1b;主要使用在读操作较多的情况下。 悲观锁&#xff1a;发生冲突的概率较大&#xff1b;主要使用在写操作较多的情况下。 2 轻量级锁…

『K8S 入门』二:深入 Pod

『K8S 入门』二&#xff1a;深入 Pod 一、基础命令 获取所有 Pod kubectl get pods2. 获取 deploy kubectl get deploy3. 删除 deploy&#xff0c;这时候相应的 pod 就没了 kubectl delete deploy nginx4. 虽然删掉了 Pod&#xff0c;但是这是时候还有 service&#xff0c…

轻松搭建FPGA开发环境:第三课——Vivado 库编译与设置说明

工欲善其事必先利其器&#xff0c;很多人想从事FPGA的开发&#xff0c;但是不知道如何下手。既要装这个软件&#xff0c;又要装那个软件&#xff0c;还要编译仿真库&#xff0c;网上的教程一大堆&#xff0c;不知道到底应该听谁的。所以很多人还没开始就被繁琐的开发环境搭建吓…

电子学会C/C++编程等级考试2021年06月(六级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:逆波兰表达式 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* +…