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_Internal
    HttpRequest->OnProcessRequestComplete().BindUObject(this, &URuntimeFilesDownloaderLibrary::OnReady_Internal);
    HttpRequest->OnRequestProgress().BindUObject(this, &URuntimeFilesDownloaderLibrary::OnProgress_Internal);
 
    // Process the request
    HttpRequest->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://www.mfbz.cn/a/340987.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

matlab 交通流量PI和P控制

1、内容简介 略 37-可以交流、咨询、答疑 2、内容说明 略. 题目背景 有一条路&#xff0c;他有一个主干道和一个次干道&#xff0c;现在这条路上有一定的交通流&#xff0c;交通流的情况是第二张图(交通流的程序在那个matlab文件里的做出的figure1里有&#xff09;&#x…

【vue3】GSAP在vue中的使用

一、获取GSAP npm install gsap 二、开始GSAP 导入GSAP&#xff0c;如果需要导入gsap的插件可以参考这里。 import gasp from gsap; 这里用的是选项式&#xff0c;在methods属性中创建一个方法用来写gsap的动画。 gasp_animation(){let tl gasp.timeline({defaults:{ ease:&…

win10 任务栏设置透明

先看效果图 第一步&#xff1a;按下“Win R”组合键&#xff0c;输入“regedit”并回车&#xff0c;打开注册表编辑器。 第二步&#xff1a;在注册表中找到路径“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced”。 第三步&#xff1a;在…

1 认识微服务

1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff1a;将业务的所有…

yolov5 opencv dnn部署 github代码

yolov5 opencv dnn部署 github代码 源码地址实现推理源码中作者的yolov5s.onnx推理条件python部署(因为python比较简单就直接介绍了)c部署 参考链接 源码地址 yolov5官网还提供的dnn、tensorrt推理链接本人使用的opencv c github代码,代码作者非本人&#xff0c;也是上面作者推…

数组(java)

数组动态初始化和静态初始化的区别&#xff1a; 动态初始化&#xff1a;手动指定数组长度&#xff0c;由系统给出默认初始化值 只明确元素个数&#xff0c;不明确具体数值&#xff0c;推荐使用动态初始化 静态初始化&#xff1a;手动指定数组元素&#xff0c;系统会根据元素…

第二百八十二回

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择图片和视频文件"相关的内容&#xff0c;本章回中将介绍如何混合选择多个图片和视频文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1…

Java 设计者模式以及与Spring关系(四) 代理模式

目录 简介: 23设计者模式以及重点模式 代理模式&#xff08;Proxy Pattern&#xff09; 静态代理示例 spring中应用 动态代理 1.基于JDK的动态代理 target.getClass().getInterfaces()作用 内名内部类写法(更简洁&#xff0c;但不推荐) 2.基于CGLIB实现 spring中应用 …

【代码随想录算法训练营第二十七天|39. 组合总和、40.组合总和II、131.分割回文串】

代码随想录算法训练营第二十七天|39. 组合总和、40.组合总和II、131.分割回文串 39. 组合总和40.组合总和II131.分割回文串 题解参考y总的&#xff1a;http://www.acwing.com 39. 组合总和 我是一看就会&#xff0c;一写就废。先看代码&#xff1a; class Solution { public:…

Databend 开源周报第 129 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 支持标准流 标…

Redis相关面试题大全

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于java面试题系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基…

SD-WAN如何解决网络质量问题?

当选择的线路面临故障、质量下降或拥塞时怎么办&#xff1f;SD-WAN采用智能选路策略&#xff0c;灵活应对各种场景&#xff0c;通过先进的线路切换机制和隧道内流控技术&#xff0c;为用户提供最佳的业务体验。下文将对SD-WAN的线路切换和隧道内流控进行介绍&#xff0c;帮助大…

PySimpleGUI:让spin支持循环

需求 自己用PySimpleGUI写了个小工具&#xff0c;但是发现它的spin不支持循环。 Tkinter本身的Spinbox有wrap这个开关可以觉得是否支持循环&#xff0c;但是没看到PySimpleGUI也支持这个特性。 代码实现 所谓spin的循环&#xff0c;是指当值变换到最大最小值时&#xff0c;可…

Java实现超市账单管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3.3 后端设计在这里插入图片描述 四、系统展示五、核心代码5.1 查询供应商5.2 查询商品5.3 新增超市账单5.4 编辑超市账单5.5 查询超市账单 六、免责说明 一、摘要 1.1 项目介绍 基于…

sell控制脚本案例

1.压缩脚本 写一个脚本&#xff0c;完成如下功能 传递一个参数给脚本&#xff0c;此参数为gzip、bzip2或者xz三者之一&#xff1b; (1) 如果参数1的值为gzip&#xff0c;则使用tar和gzip归档压缩/etc目录至/backups目录中&#xff0c;并命名为/backups/etc-20160613.tar.gz&am…

unity项目《样板间展示》开发:火焰和UI设计

第二章&#xff1a;火焰和UI设计 前言一、火焰模型管理灶台火焰壁炉火焰 二、电视机播放三、UI设计结语 前言 这次带大家从0到1做一个unity项目&#xff1a;《样板间展示》。 顾名思义&#xff0c;项目内容是展示样板间&#xff0c;即玩家可以与房间中的物体、家具进行交互。 至…

网络安全概述---笔记总结

网络安全概述 网络安全---Cyberspace security 2003年美国提出网络空间的概念 --- 一个由信息基础设施组成的互相依赖的网络。我国官方文件定义&#xff1a;网络空间为继海&#xff0c;陆&#xff0c;空&#xff0c;天以外的第五大人类活动领域 发展阶段&#xff1a; 通信保…

如何用html画出一个烟花?

问题描述&#xff1a;如何用html画出一个烟花&#xff1f; 问题解答&#xff1a; 将下面代码复制到一个txt文件中&#xff0c;然后修改后缀txt→html&#xff0c;用浏览器打开就是烟花了。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">…

第4章-IP基本原理

目录 1. IP协议概述 1.1. 定义 1.2. 功能 1.3. IP网络的结构 1.4. IP头格式 2. IP地址和地址映射 3. IP包转发 4. 其他相关协议介绍 1. IP协议概述 1.1. 定义 IP协议&#xff1a;IP协议是网际互连协议&#xff1b; 工作层次&#xff1a;网络层&#xff1b; 封装&#…

esp32-idf eclipse 分区表(partition table / NVS)的读写demo

前言&#xff1a; 分区表&#xff08;Partition Table&#xff09;和 NVS&#xff08;Non-Volatile Storage&#xff09;是 ESP-IDF 中用于存储数据的两种不同机制。 分区表&#xff08;Partition Table&#xff09;&#xff1a; 分区表定义了将 Flash 存储器划分为不同逻辑分…