UE4C++ Http下载文件

2023-10-27

成果
在这里插入图片描述
功能:点击一个按钮可以远程下载文件 并看得到进度条

先上代码
.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);
};

.cpp文件

// Fill out your copyright notice in the Description page of Project Settings.


#include "RuntimeFilesDownloaderLibrary.h"
#include "HttpModule.h"
#include "Interfaces/IHttpRequest.h"
#include "Interfaces/IHttpResponse.h"

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;

	//TSharedRef<IHttpRequest, ESPMode::ThreadSafe> HttpRequest = FHttpModule::Get().CreateRequest();

	TSharedPtr<IHttpRequest, ESPMode::ThreadSafe> HttpRequest = FHttpModule::Get().CreateRequest();

	HttpRequest->SetVerb("GET");
	HttpRequest->SetURL(FileURL);
	//HttpRequest->SetTimeout(TimeOut);
	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;
			}
		}

		// 
		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);
	}
}

代码参考的知乎大佬 注意UE4.27 http里

 TSharedRef<IHttpRequest> HttpRequest = FHttpModule::Get().CreateRequest();注意这段代码已经不适用了 根据UE官方源码4.27已经修改成
 		TSharedPtr<IHttpRequest, ESPMode::ThreadSafe> Request = FHttpModule::Get().CreateRequest();

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UE4C++ Http下载文件 的相关文章

  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 将参数传递给 http.HandlerFunc

    我正在使用 Go 的内置 http 服务器pat http github com bmizerany pat响应某些 URL mux Get products http HandlerFunc index func index w http
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐

  • 写入单元格_Excel VBA单元格的基本操作(一)

    在Excel VBA中 对单元格的操作可以有多种形式来定义表示 1 打开Visual Basic 添加模块和过程 称之为 单元格操作 Sub 单元格操作 End Sub 2 单元格第一种表达方式 直接定位到某个单元格 B3 Sub 单元格操
  • ES6的Class的prototype、__proto__

    ES6继承与ES5的区别 ES6通过class实现继承 class的继承通过关键字extends实现 class Parent constructor name this name name getName console log this
  • Linux下基于Zynq用EthLite+GmiitoRgmii实现100M网络通信

    目录 前言 一 IP核配置 1 ETHLITE配置 2 GMIITORGMII配置 二 IP 连接关系 三 设备树描述 前言 本文将介绍如何在Linux下使用EthLite加GmiitoRgmii实现百兆网络通信 此方法只需要一个中断 若工
  • 百度AIStudio平台 持久化安装包

    目录 查看环境 创建目录 安装在该目录下 重启后仍可用 查看环境 平台使用的是conda创建的虚拟环境进行安装的包 不过我们可以使用pip安装工具快速安装 而且使用conda默认安装的包将在下次启动服务时还原 注 该教程不适用于tensor
  • Create a PCL visualizer in Qt with QtDesigner

    这是PCL文档中的例程实现 原文地址 http pointclouds org documentation tutorials qt visualizer php more on qt and pcl 介绍一下环境 Ubuntu16 04
  • std::numeric_limits 出错

    not enough actual parameters for macro max for std numeric limits
  • cuBLAS矩阵乘法性能分析(附代码示例)

    使用教程 矩阵乘法是神经网络中最基础 最重要的一个运算 在用CUDA实现矩阵乘法时 不需要我们手动写 cuBLAS库提供了现成的矩阵乘法算子 例如cublasGemmEx和cublasLtMatmul 其中后者是轻量级版本 API调用更灵活
  • DL入门(1):卷积神经网络(CNN)

    写在前面 看预测论文综述时 面临这样一个问题 很多DL的方法只是会简单运用 却不是特别了解其详细原理 故针对CNN RNN LSTM AutoEncoder RBM DBN以及DBM分别做一些简单总结 以达到了解的目的 此篇为CNN 目录
  • torch.stack()按轴叠加原理

    1 问题 大部分帖子和一些典型的介绍numpy pytorch的书籍对此部分并没有详细的介绍 仅仅简单地在np cat 或torch stack 等中提到当连接轴指定为0 或1时按照某某连接 排列 然而 当连接轴值较大时 如3 4 5 笔者
  • vue3 的组件通信以及ref的使用&v-model

    一 组件通信 1 props gt 父向子传值 props主要用于父组件向子组件通信 在父组件中通过用 msg msg 绑定需要传给子组件的属性值 然后再在子组件中用 props 接收该属性值 方法一 普通方式 父组件 传值
  • linux 编译protobuf(MacOS或者UOS),Protobuf为3.5.1

    先下载好Protobuf 自己网上找 或者用我下面上传的包 我们采用编译成静态库的模式 就不生成 so文件了 解压后进行编译前的准备工作 cd protobuf 3 5 1 进入目录 autogen sh 执行下生成configure文件
  • 储存型XSS和DOM型XSS的解析

    储存型XSS和DOM型XSS的解析 存储型XSS漏洞 存储型的XSS漏洞和反射型形成的原因是一样的 也在输入输出时造成的问题 不同的是存储型的XSS下可以将攻击者的脚本注入后台存储起来 结构更加持久的危害 因此存储型XSS也称 永久型 XS
  • 力扣 91. 解码方法

    一开始的想法是 每个字母的编码要么是一位数字 要么是两位数字 所以从尾部开始看是否能取出一位数字或者两位数字 再讨论取出数字后剩下的字符串有几种解码方式 其实就是动态规划的思想 由于今天第一次做动规的题 第一想法是用递归求解 结果超时了 然
  • 实测aiCache加速效能测试报告

    服务器 AMD双核DualCore QL 62 系统搭载743M的 RAM 运行64位Ubuntu 9 1 软件 Apache2 配置 未修改的缺省配置 Apache2配置侦听82端口 aiCache采用HTTP80端口 测试细节 Apac
  • window.print()打印时根据页面高度设置居中显示、设置打印布局(纵向、横向)

    1 页面定义打印div按钮 div style background color EDEDED span class fa fa print hidden print title 打印 style font size 24px span d
  • c++中成员初始化(普通成员变量和静态成员变量)

    1 c 中普通成员变量的初始化 1 对于普通变量直接在头文件声明的时候就进行初始化 c 11的标准下是可以直接这样使用的 2 就是通过初始化列表进行初始化 3 在构造函数中进行初始化 以下通过一段代码的初始化工作 可以看出来 成员变量初始化
  • 深入理解 Go 调度模型 GPM

    Author mogd 2022 04 28 Update mogd 2022 05 05 Adage Be content with what you have rejoice in the way things are When you
  • C++面向对象(黑马程序员)

    内存分区模型 include
  • 常见的几种缓存软件以及使用缓存需要考虑的问题

    目录 几种缓存 缓存使用中存在的问题 缓存不足 缓存击穿问题 热点数据
  • UE4C++ Http下载文件

    成果 功能 点击一个按钮可以远程下载文件 并看得到进度条 先上代码 h文件 Fill out your copyright notice in the Description page of Project Settings pragma