-
下载OSS SDK 下载SDK安装包
-
安装CMake下载CMake
安装的时候记得勾选自动配置环境变量
安装完后,cmd 输入cmake 确认环境变量是否正常,没有的手动添加(记得重启电脑)。
-
下载的SDK中不直接提供alibabacloud-oss-cpp-sdk.sln工程文件,需要通过cmake生成所需的工程文件。
创建build文件夹,并运行cmake …
输入cd build
输入cmake …
打开build文件夹,双击点开alibabacloud-oss-cpp-sdk.sln,开始进行编译
编译前需要注意的是,UE本身提供OpenSSL模块,并且UE的所使用的文件版本比阿里云OSS SDK要新很多,所以需要先替换阿里云 OSS SDK的OpenSSL头文件。(否则UE插件编译会报错)
先找到UE路径下的OpenSSL头文件
复制到阿里云OSS SDK下所引用的头文件文件夹进行全选替换
添加C++预处理器定义 CURL_STATICLIB(否则UE插件编译会报错)
开始编译
找到需要的UE需要的alibabacloud-oss-cpp-sdk.lib文件
4. 打开UE5工程,创建空白插件
将所需要的 alibabacloud-oss-cpp-sdk.lib文件放到该插件下
将阿里云插件的include文件拷贝到新建的UE插件下
打开Build.cs文件,按照下图更改
5.在该插件内创建UE 新的C++类,父类是GameInstanceSubsystem
创建上传文件的函数
头文件.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "AliyunSubsystem.generated.h"
USTRUCT(BlueprintType)
struct FOssUserData
{
GENERATED_BODY()
public:
//Oss AccessKeyID
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString AccessKeyID;
//Oss AccessKeySecret
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString AccessKeySecret;
//Oss Endpoint
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString Endpoint;
};
USTRUCT(BlueprintType)
struct FOssError
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString errCode;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString RequestId;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString errMsg;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FOssUserData Data;
FOssError()
{
errCode = "0";
}
};
/**
*
*/
DECLARE_DYNAMIC_DELEGATE_TwoParams(FOssComplete, bool, isSuccess, const FOssError&, UserData);
UCLASS()
class ALIYUNOSS_API UAliyunSubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
//文件上传
UFUNCTION(BlueprintCallable, Category = "Aliyun")
void OssUploadFiles(FOssUserData UserData, FString BucketName, FString OssFilePath, FString LocalFilePath,FOssComplete resultCallBack);
};
实现.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "AliyunSubsystem.h"
#include <fstream>
#include "alibabacloud/oss/OssClient.h"
using namespace AlibabaCloud::OSS;
void UAliyunSubsystem::OssUploadFiles(FOssUserData UserData, FString BucketName, FString OssFilePath, FString LocalFilePath, FOssComplete resultCallBack)
{
std::string _AccessKeyID = TCHAR_TO_UTF8(*UserData.AccessKeyID);
std::string _AccessKeySecret = TCHAR_TO_UTF8(*UserData.AccessKeySecret);
std::string _Endpoint = TCHAR_TO_UTF8(*UserData.Endpoint);
std::string _BucketName = TCHAR_TO_UTF8(*BucketName);
std::string _ObjectName = TCHAR_TO_UTF8(*OssFilePath);
std::string _FilePath = TCHAR_TO_UTF8(*LocalFilePath);
/* 初始化网络等资源。*/
InitializeSdk();
ClientConfiguration conf;
OssClient client(_Endpoint, _AccessKeyID, _AccessKeySecret, conf);
//auto outcome = client.PutObject(_BucketName, _ObjectName, _FilePath);
AsyncTask(ENamedThreads::AnyThread, [=]() {
auto outcome = client.PutObject(_BucketName, _ObjectName, _FilePath);
if (!outcome.isSuccess())
{
UE_LOG(LogTemp, Log, TEXT("上传异常"));
FOssError err;
err.Data = UserData;
err.errCode = UTF8_TO_TCHAR(outcome.error().Code().c_str());
err.errMsg = UTF8_TO_TCHAR(outcome.error().Message().c_str());
err.RequestId = UTF8_TO_TCHAR(outcome.error().RequestId().c_str());
AsyncTask(ENamedThreads::GameThread, [=]()
{
resultCallBack.ExecuteIfBound(false, err);
});
return;
}
FOssError err;
err.Data = UserData;
AsyncTask(ENamedThreads::GameThread, [=]()
{
resultCallBack.ExecuteIfBound(true, err);
});
});
/* 释放网络等资源。*/
ShutdownSdk();
}
6.阿里云OSS管理控制台内容配置
7.UE测试