
cpp
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "HttpModule.h"
#include "Interfaces/IHttpRequest.h"
#include "Interfaces/IHttpResponse.h"
#include "GameFramework/Actor.h"
#include "A_Hbt_AsyncDownloadFile.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FDownloadResultDelegate, bool, bSuccess, FString, FilePath);
UCLASS()
class AIEASEMAN3PROJECT_API AA_Hbt_AsyncDownloadFile : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AA_Hbt_AsyncDownloadFile();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
/*视频下载*/
public:
UFUNCTION(BlueprintCallable, Category = "Video Downloader")
void DownloadVideoInBlueprint(const FString& URL, const FString& SavePath);
private:
// 下载视频文件
// HTTP 请求完成时的回调函数
void OnDownloadComplete(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful, const FString& SavePath);
};
cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "A_Hbt_AsyncDownloadFile.h"
// Sets default values
AA_Hbt_AsyncDownloadFile::AA_Hbt_AsyncDownloadFile()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
}
// Called when the game starts or when spawned
void AA_Hbt_AsyncDownloadFile::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void AA_Hbt_AsyncDownloadFile::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
void AA_Hbt_AsyncDownloadFile::DownloadVideoInBlueprint(const FString& URL, const FString& SavePath)
{ // 创建 HTTP 请求
TSharedRef<IHttpRequest, ESPMode::ThreadSafe> HttpRequest = FHttpModule::Get().CreateRequest();
HttpRequest->SetVerb("GET"); // 使用 GET 方法下载文件
HttpRequest->SetURL(URL); // 设置下载的 URL
// 绑定回调函数
//HttpRequest->OnProcessRequestComplete().BindUObject(this, &AA_Hbt_AsyncDownloadFile::OnDownloadComplete, *SavePath);
HttpRequest->OnProcessRequestComplete().BindLambda(
[this, SavePath](FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful) {
this->OnDownloadComplete(Request, Response, bWasSuccessful, SavePath);
}
);
// 发送请求
HttpRequest->ProcessRequest();
}
void AA_Hbt_AsyncDownloadFile::OnDownloadComplete(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful, const FString& SavePath)
{
if (bWasSuccessful && Response.IsValid())
{
// 获取下载的数据
const TArray<uint8>& Data = Response->GetContent();
// 将数据写入文件
if (FFileHelper::SaveArrayToFile(Data, *SavePath))
{
UE_LOG(LogTemp, Display, TEXT("视频下载成功,保存路径:%s"), *SavePath);
}
else
{
UE_LOG(LogTemp, Error, TEXT("文件保存失败!"));
}
}
else
{
UE_LOG(LogTemp, Error, TEXT("下载失败!"));
}
}
用法解析
cpp
HttpRequest->OnProcessRequestComplete().BindLambda(
[this, SavePath](FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful) {
this->OnDownloadComplete(Request, Response, bWasSuccessful, SavePath);
}
);
1.Lambda 表达式的基本结构
捕获列表\](参数列表) { 函数体 } 2.用噶 * **`[this, SavePath]`** :捕获列表,表示 Lambda 可以访问当前对象的 `this` 指针和局部变量 `SavePath`。 * **`(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)`** :参数列表,与 `OnProcessRequestComplete` 回调的签名一致。 * **`{ 函数体 }`** :调用成员函数 `OnDownloadComplete`,并传递参数。