http网络编程——在ue5中实现文件传输功能
http网络编程在ue5中实现
需求:在unreal中实现下载功能,输入相关url网址,本地文件夹存入相应文件。
一、代码示例
1.Build.cs需要新增Http模块,样例如下。
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HTTP" });
2.RuntimeFilesDownloaderLibrary.h文件
// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "UObject/Object.h"
#include "Interfaces/IHttpRequest.h"
#include "RuntimeFilesDownloaderLibrary.generated.h"UENUM(BlueprintType, Category = "Runtime Files Downloader")
enum DownloadResult
{SuccessDownloading UMETA(DisplayName = "Success"),DownloadFailed UMETA(DisplayName = "Download failed"),SaveFailed UMETA(DisplayName = "Save failed"),DirectoryCreationFailed UMETA(DisplayName = "Directory creation failed")
};
DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnFilesDownloaderProgress, const int32, BytesSent, const int32, BytesReceived, const int32, ContentLength);DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnFilesDownloaderResult, TEnumAsByte < DownloadResult >, Result);UCLASS()
class DOWNLOAD_API URuntimeFilesDownloaderLibrary : public UObject
{GENERATED_BODY()
public:UPROPERTY(BlueprintAssignable, Category = "Runtime Files Downloader")FOnFilesDownloaderProgress OnProgress;UPROPERTY(BlueprintAssignable, Category = "Runtime Files Downloader")FOnFilesDownloaderResult OnResult;UPROPERTY(BlueprintReadOnly, Category = "Runtime Files Downloader")FString FileURL;UPROPERTY(BlueprintReadOnly, Category = "Runtime Files Downloader")FString FileSavePath;UFUNCTION(BlueprintCallable, Category = "Runtime Files Downloader")static URuntimeFilesDownloaderLibrary* CreateDownloader();UFUNCTION(BlueprintCallable, Category = "Runtime Files Downloader")bool DownloadFile(const FString& URL, const FString& SavePath, float TimeOut = 5);
private:void OnProgress_Internal(FHttpRequestPtr Request, int32 BytesSent, int32 BytesReceived);void OnReady_Internal(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);
};
3.RuntimeFilesDownloaderLibrary.cpp文件
#include "RuntimeFilesDownloaderLibrary.h"
#include "HttpModule.h"
#include "Interfaces/IHttpRequest.h"
#include "Interfaces/IHttpResponse.h"
//创建了一个URuntimeFilesDownloaderLibrary对象,并将其添加到根对象,防止系统自动回收
URuntimeFilesDownloaderLibrary* URuntimeFilesDownloaderLibrary::CreateDownloader()
{URuntimeFilesDownloaderLibrary* Downloader = NewObject<URuntimeFilesDownloaderLibrary>();Downloader->AddToRoot();return Downloader;
}bool URuntimeFilesDownloaderLibrary::DownloadFile(const FString& URL, const FString& SavePath, float TimeOut)
{if (URL.IsEmpty() || SavePath.IsEmpty() || TimeOut <= 0){return false;}FileURL = URL;FileSavePath = SavePath;/*ue4.27旧版本弃用下列方法*//*TSharedRef<IHttpRequest, ESPMode::ThreadSafe> HttpRequest = FHttpModule::Get().CreateRequest();*///4.27及以后使用如下方法TSharedPtr<IHttpRequest, ESPMode::ThreadSafe> HttpRequest = FHttpModule::Get().CreateRequest();HttpRequest->SetVerb("GET");HttpRequest->SetURL(FileURL);//HttpRequest->SetTimeout(TimeOut);//监听事件OnProcessRequestComplete绑定OnReady_Internal,OnRequestProgress绑定OnProgress_InternalHttpRequest->OnProcessRequestComplete().BindUObject(this, &URuntimeFilesDownloaderLibrary::OnReady_Internal);HttpRequest->OnRequestProgress().BindUObject(this, &URuntimeFilesDownloaderLibrary::OnProgress_Internal);// Process the requestHttpRequest->ProcessRequest();return true;
}//监听事件
void URuntimeFilesDownloaderLibrary::OnProgress_Internal(FHttpRequestPtr Request, int32 BytesSent, int32 BytesReceived)
{const FHttpResponsePtr Response = Request->GetResponse();if (Response.IsValid()){const int32 FullSize = Response->GetContentLength();OnProgress.Broadcast(BytesSent, BytesReceived, FullSize);}
}void URuntimeFilesDownloaderLibrary::OnReady_Internal(FHttpRequestPtr Request, FHttpResponsePtr Response,bool bWasSuccessful)
{
RemoveFromRoot();Request->OnProcessRequestComplete().Unbind();if (Response.IsValid() && EHttpResponseCodes::IsOk(Response->GetResponseCode()) && bWasSuccessful){//IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();// FString Path, Filename, Extension;FPaths::Split(FileSavePath, Path, Filename, Extension);//查看文件夹,没有则创建文件if (!PlatformFile.DirectoryExists(*Path)){if (!PlatformFile.CreateDirectoryTree(*Path)){OnResult.Broadcast(DirectoryCreationFailed);return;}}// 开启文件写入//通过PlatformFile.OpenWrite()函数打开文件句柄,以便将下载的数据写入文件中。函数的参数是一个TCHAR类型的字符串,表示文件的路径和文件名。//然后,检查句柄是否成功打开。如果句柄成功打开,就将HTTP请求响应中的数据通过FileHandle->Write()函数写入到文件中。IFileHandle* FileHandle = PlatformFile.OpenWrite(*FileSavePath);if (FileHandle){// FileHandle->Write(Response->GetContent().GetData(), Response->GetContentLength());// delete FileHandle;OnResult.Broadcast(SuccessDownloading);}else{OnResult.Broadcast(SaveFailed);}}else{OnResult.Broadcast(DownloadFailed);}
}
二、蓝图示例


该蓝图在关卡中调用,通过Event Begin Play事件监听行为,当按下

按钮,创建DOWNLOADER对象,并执行下载功能,下载时对下载行为进行监听,包括RESULT(Success,Download failed,Save failed,Directory creation failed四种下载结果)和以下三个数据信息:
· BytesSent 表示已发送的字节数,指示已经发送到服务器的字节数。
· BytesReceived 表示已接收的字节数,指示已从服务器接收到的字节数。
· FullSize 表示完整内容的长度,指示需要下载的文件的总字节数。
最后通过BytesReceived/FullSize计算出百分号数据,实现下载进度实时追踪,下载完成后RESULT枚举信息输出。
三、效果展示
在蓝图中输入url和save path相关信息,time out为响应时间设置。

下载过程实现监听,下载完成后输出RESULT枚举类型。

最后本地文件夹成功下载http文件。

相关文章:
http网络编程——在ue5中实现文件传输功能
http网络编程在ue5中实现 需求:在unreal中实现下载功能,输入相关url网址,本地文件夹存入相应文件。 一、代码示例 1.Build.cs需要新增Http模块,样例如下。 PublicDependencyModuleNames.AddRange(new string[] { "Core&q…...
JVM之java内存区域[2](堆、方法区、直接内存)
文章目录 版权声明一 堆1.1 java堆1.2 模拟堆区的溢出1.3 arthas中堆内存相关的功能1.4 设置大小 二 方法区2.1 方法区简介2.2 补充:字符串常量池和运行时常量池2.3 方法区的大小设计2.4 arthas中查看方法区2.5 模拟方法区的溢出2.7 StringTable的练习题 三 神奇的i…...
k8s-kubectl常用命令
一、基础命令 1.1 get 查询集群所有资源的详细信息,resource包括集群节点、运行的Pod、Deployment、Service等。 1.1.1 查询Pod kubectl get po -o wid 1.1.2 查询所有NameSpace kubectl get namespace 1.1.3 查询NameSpace下Pod kubectl get po --all-namespaces…...
如何在Docker上运行Redis
环境: 1.windows系统下的Docker deckstop 1.Pull Redis镜像 2.运行Redis镜像 此时,Redis已经启动,我们登录IDEA查看下是否连接上了 显示连接成功,证明已经连接上Docker上的Redis了...
【深度学习:集中偏差】减少计算机视觉数据集中偏差的 5 种方法
【深度学习:集中偏差】减少计算机视觉数据集中偏差的 5 种方法 有偏差的计算机视觉数据集会导致哪些问题?如何减少计算机视觉数据集中偏差的示例观察并监控带注释样本的类别分布确保数据集代表模型适用的人群明确定义对象分类、标记和注释的流程为标签质…...
java数据结构与算法刷题-----LeetCode667. 优美的排列 II
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 解题思路 题目要求我们返回一个数组长度为n的数组,必须含有1~n…...
win10 20h2 defender添加排除项失败怎么回事 Window Defender添加不了排除项如何处理
我们都知道win10系统中是内置有Windows Defender安全防护软件的,会自动对电脑中的所有文件进行扫描,但是有用户可能某些文件不希望被扫描,那么我们可以添加排除项,可是有不少win10 20h2用户在defender添加排除项的时候却失败了&am…...
mysql生成最近24小时整点时间临时表
文章目录 生成最近24小时整点生成最近30天生成最近12个月 生成最近24小时整点 SELECT-- 每向下推1行, i比上次减去1b.*, i.*,DATE_FORMAT( DATE_SUB( NOW(), INTERVAL ( -( i : i - 1 ) ) HOUR ), %Y-%m-%d %H:00 ) AS time FROM-- 目的是生成12行数据( SELECTa FROM( SELECT…...
基于PHP反序列化练习
PHP创建一个以自己姓名命名的类,要求存在两个属性,name,age,进行序列化,输出序列化以后的数据。 <!-- PHP创建一个以自己姓名命名的类,要求存在两个属性,name,age --> <?…...
ITSS、ITIL、ISO20000:哪个更适合你?
在IT服务管理领域,ITSS、ITIL和ISO20000是备受关注的三大标准。它们在性质、设立组织、目的和适用对象等方面各有千秋。那么,如何在这三大标准中选择最适合自己的呢?下面,让我们一起揭开它们的神秘面纱! 1️⃣ 性质&am…...
Linux配置yum源以及基本yum指令
文章目录 一、yum介绍二、什么是软件包三、配置yum源四、一键配置yum源【三步走】五、yum指令搜索软件安装软件卸载软件 六、其他yum指令更新内核更新软件更新指定软件显示所有可更新的软件清单卸载指定包并自动移除依赖包删除软件包,以及软件包数据和配置文件 一、…...
【AI视野·今日Robot 机器人论文速览 第七十五期】Thu, 11 Jan 2024
AI视野今日CS.Robotics 机器人学论文速览 Thu, 11 Jan 2024 Totally 16 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers Analytical Model and Experimental Testing of the SoftFoot: an Adaptive Robot Foot for Walking over Obstacles and Irre…...
阿里云ECS(CentOS镜像)安装docker
目录 1.前置条件 2.连接至ECS 3.yum软件包更新 4.安装docker前置所需软件包 5.添加docker 官方的 yum 软件源 6.安装docker 7.检测是否成功 8.配置阿里云镜像加速器 1.前置条件 在看本文前保证未安装过docker,或者安装过但是清理干净 如果多次安装失败过,…...
服务器工作环境要求
在开展网站服务之前,合适的服务器工作环境是必不可少的。服务器工作环境指需要一定的软硬件条件来保障服务器可以正常地运转和提供高效率的服务。在这篇文章中,我们将会详细讲解服务器工作环境所需的要素。 一、硬件要求 服务器硬件方面包括了基本的电…...
大数据开发之Spark(入门)
第 1 章:Spark概述 1.1 什么是spark 回顾:hadoop主要解决,海量数据的存储和海量数据的分析计算。 spark是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 1.2 hadoop与spark历史 hadoop的yarn框架比spark框架诞生的晚ÿ…...
【GoLang入门教程】Go语言工程结构详述
程序员裁员潮:技术变革下的职业危机 文章目录 程序员裁员潮:技术变革下的职业危机前言总结:专栏集锦强烈推荐写在最后 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网…...
FPGA之分布式RAM(2)
1) 128 X1 Single Port Distributed RAM 下图中可以看出来,通过2个LUT的组合使用可以串联实现更大深度的分布式RAM.下图中出现了F7BMUX的加入, F7BMUX可以用于LUT输出的选通. 原语调用: RAM128XIS#(INIT(128h00000000000000000000000000000000) // Initial conten…...
纯c实现栈和队列 数据结构大全
栈 栈是一种后进先出的数据结构,可以用数组来模拟实现,掌握必要的数据结构是非常的有必要的 一样是先打出头文件 #pragma once#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include &…...
测试开发基础 | 计算机网络篇(二):物理层与数据链路层
【摘要】 计算机网络知识是自动化测试等技术基础,也是测试面试必考题目。霍格沃兹测试学院特别策划了本系列文章,将带大家一步步夯实计算机网络的基础知识。由于物理层知识在互联网软件研发工作中用到的并不多,所以可以仅做一个简单的了解。物…...
【深度学习】BasicSR训练过程记录,如何使用BasicSR训练GAN
文章目录 两种灵活的使用场景项目结构概览简化的使用方式 项目结构解读1. 代码的入口和训练的准备工作2. data和model的创建2.1 dataloader创建2.2 model的创建 3. 训练过程 动态实例化的历史演进1. If-else判断2. 动态实例化3. REGISTER注册机制 REGISTER注册机制的实现1. DAT…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践
在电商行业蓬勃发展的当下,多平台运营已成为众多商家的必然选择。然而,不同电商平台在商品数据接口方面存在差异,导致商家在跨平台运营时面临诸多挑战,如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...
