写在前面:本篇博客,算是我个人整理并亲自实现整个流程的吧,也就厚着脸说是原创了(尽管东拼西凑,实现了具体功能),具体本篇具体引用了谁的源码,亦有说明,关于文件服务器的配置也是烂大街的,就不再赘述了。
1, 文件服务器的搭建:
网上有各种各样的文件服务器,不可能罗列出所有(个人偏重于IIS和Tomcat),这里使用Apache Tomcat(版本7.0.82):
首先下载tomcat,链接地址为:http://www.nigeriaembassy.cn/download-70.cgi
解压到指定的目录中,这里以我的文件夹为例:
E:\apache-tomcat-7.0.82
1,打开系统的环境变量设置页面:
添加环境变量:
变量名:CATALINA_BASE,变量值为Tomcat的解压路径,以我个人为例:E:\apache-tomcat-7.0.82
变量名:CATALINA_HOME,变量的值为:E:\apache-tomcat-7.0.82
然后在PATH变量中添加变量值:%CATALINA_HOME%\lib;%CATALINA_HOME%\bin;
(事实上,该变量可以一次性的配置到系统目录中,这样写可以更直观些吧)
2.启动cmd,输入:startup,出现tomcat的启动对话框说明配置成功。如果要在服务中把tomcat的服务设置成自动,如果你下载的是解压版tomcat,那么你就需要在cmd中输入service install命令,使得tomcat在服务列表中出现,再设置为自动启动。
3,关于Tomcat的网页测试:
你可以用一下路径测试,测试的结果为Apache tomcat的主页:
Http://localhost:8080/
http://127.0.0.1:8080/
8080端口为Tomcat的默认端口,如果你在server.xml中设置过别的端口,那么你可以用自己的端口测试该页。
4,虚拟文件路径的配置:
首先你需要找到Tomcat的server.xml配置文件:
以个人的路径为例,它在:E:\apache-tomcat-7.0.82\conf\server.xml
找到
解释一下:docBase为你的服务器真实的硬盘路径,这里要存放以后你的服务器文件等,默认的在Tomcat的webapps目录下,这里设置虚拟路径,是为了满足自定义需要。
Path值是索引网络地址的虚拟路径。例如通过本地测试,你可以通过在浏览器中输入:
Http://localhost:8080/UE4Project/来查看服务器文件列表中的文件。
到此刻文件服务器的基本搭建完成了。
2, UE4的HTTP代码部分:
这里使用了陌上花开w的文章,《UE4之HTTP请求》(感谢作者),文章地址:
http://www.nigeriaembassy.cn/yb0022/article/details/76383297
首先改造他的代码,把它做成接口,手写或者通过Editor都行:
头文件内容:
#pragmaonce
#include"CoreMinimal.h"
#include"Http.h"
#include"HttpRequestTest.generated.h"
UINTERFACE(meta= (CannotImplementInterfaceInBlueprint))
classUHttpRequestTest :public UInterface
{
GENERATED_BODY()
};
classHOTUPDATE_API IHttpRequestTest
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category =DownloadPak)
virtual void Download(constFString& URL);
UFUNCTION(BlueprintCallable, Category =DownloadPak)
virtual void Upload(constFString& URL, const FString& ContentString);
void OnRequestComplete(FHttpRequestPtrHttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded);
void OnRequestProgress(FHttpRequestPtrHttpRequest, int32 BytesSent, int32 BytesReceived);
};
Cpp实现文件:
#pragma once
#include"HttpRequestTest.h"
#include"FileHelper.h"
#include"Paths.h"
voidIHttpRequestTest::Download(const FString& URL)
{
TSharedRef
HttpReuest->SetURL(URL);
HttpReuest->SetVerb(TEXT("GET"));
HttpReuest->SetHeader(TEXT("Content-Type"),TEXT("application/x-www-form-urlencoded"));
HttpReuest->OnProcessRequestComplete().BindRaw(this,&IHttpRequestTest::OnRequestComplete);
HttpReuest->OnRequestProgress().BindRaw(this,&IHttpRequestTest::OnRequestProgress);
HttpReuest->ProcessRequest();
}
voidIHttpRequestTest::Upload(const FString& URL, const FString&ContentString)
{
TSharedRef
HttpReuest->SetURL(URL);
HttpReuest->SetVerb(TEXT("POST"));
HttpReuest->SetHeader(TEXT("Content-Type"),TEXT("application/x-www-form-urlencoded"));
HttpReuest->SetContentAsString(ContentString);//也可以用SetContent,只不过参数要换成TArray
HttpReuest->OnProcessRequestComplete().BindRaw(this,&IHttpRequestTest::OnRequestComplete);
HttpReuest->OnRequestProgress().BindRaw(this,&IHttpRequestTest::OnRequestProgress);
HttpReuest->ProcessRequest();
}
voidIHttpRequestTest::OnRequestComplete(FHttpRequestPtr HttpRequest,FHttpResponsePtr HttpResponse, bool bSucceeded)
{
if (!HttpRequest.IsValid() ||!HttpResponse.IsValid())
{
return;
}
else if (bSucceeded &&EHttpResponseCodes::IsOk(HttpResponse->GetResponseCode()))
{
//如果是下载请求,可通过这段代码将文件保存
FString Filename =FPaths::GetCleanFilename(HttpRequest->GetURL());
FString tempDir = FPaths::GameDir() +"/Content/Paks/";
FFileHelper::SaveArrayToFile(HttpResponse->GetContent(),*FString::Printf(TEXT("%s%s"), *tempDir, *Filename));
}
}
voidIHttpRequestTest::OnRequestProgress(FHttpRequestPtr HttpRequest, int32BytesSent, int32 BytesReceived)
{
}
注意事项:你需要在项目中的Build.cs文件里加入以下Module:”Http”,这篇文章是在UE4 4.17.2的正式版本下编写的,如果你看到这篇文章时,已经距离写这篇文章很久了,那么你需要考虑一下当前的头文件,模块及函数的变化情况。
接下来,你需要编译项目,并在Editor里创建蓝图,并继承自该接口,如果无法继承,你可以通过源码的方式创建Actor,并继承该接口。
3, 在蓝图里调用函数Download,并在Url里填写文件路径及文件名:
例如,你的项目打的pak为:HotUpdate-WindowsNoEditor_0_P.pak,那么你在url里可以这样写:http://127.0.0.1:8080/UE4Project/HotUpdate-WindowsNoEditor_0_P.pak,
4, 增量打包,具体怎么实施,参见其他的增量打包部分(官方亦有说明)。
然后把增量包放到服务器的硬盘路径里,即文件服务器的虚拟目录里:
本篇为:docBase=”E:\ServerFile\UE4\”(前面的文件服务器的配置里提到过)
5,运行你的客户端,并点击测试下载按钮,然后等下载完毕后,关闭客户端,并重新运行,就可以看到执行的结果了。更细致的操作,需要磨合,当然,作为一个下载Demo,本篇已经可以打了。