I created an in-game bug reporter for Industries of Titan. Users can type in a message and it gets sent, along with a screenshot and a zip of their latest save to a server for us to look through.
This is an example of how to set up something similar in C++.
Update: @sswires89 pointed out that this relies on MimeHttpUpload.h
which is currently only available through UDN. Sorry about the confusion!
BUIUploader.h
#pragma once
#include "Interfaces/IHttpRequest.h"
#include "HttpModule.h"
#include "UI/Util/MimeHttpUpload.h"
#include "BUIUploader.generated.h"
class UBUIUploader
{
GENERATED_BODY()
public:
UBUIUploader(const FObjectInitializer& ObjectInitializer);
FOnMimeUploadHttpRequestComplete RequestCompleteDelegate;
void SendReport();
}
BUIUploader.cpp
#include "BUIUploader.h"
#include "Interfaces/IHttpResponse.h"
#include "UI/Util/MimeHttpUpload.h"
#include "Windows/WindowsPlatformMisc.h"
#include "GenericPlatformFile.h"
UBUIUploader::UBUIUploader(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
// This will be called when the HTTP post is complete
RequestCompleteDelegate.BindUObject(this, &UBUIUploader::OnRequestComplete);
}
void UBUIUploader::SendReport()
{
TSharedRef<FMimeHttpUpload> MimeUpload = FMimeHttpUpload::Create();
// Basic string values
MimeUpload->AddFormField("my_key", "Hello World");
MimeUpload->AddFormField("another_key", "Great");
// Take a screenshot
FString RequestedScreenshotPath = FPaths::ScreenShotDir() / "my_screenshot.webp";
FScreenshotRequest::RequestScreenshot(RequestedScreenshotPath, true, true);
// Add a screenshot
TArray<uint8> ScreenshotRawData;
FFileHelper::LoadFileToArray(ScreenshotRawData, *FScreenshotRequest::GetFilename());
MimeUpload->AddAttachment("screenshot_file", "upload_screenshot.webp", "image/png", ScreenshotRawData);
// Add a zip
const FString ZipFilePath = "Fill/This/In/my.zip";
TArray<uint8> SaveZipRawData;
FFileHelper::LoadFileToArray(SaveZipRawData, *ZipFilePath);
MimeUpload->AddAttachment("zip_file", Filename, "application/zip", SaveZipRawData);
// Send the request
TSharedRef<IHttpRequest> HttpRequest = FHttpModule::Get().CreateRequest();
const FString Url = "http://some.server.com";
MimeUpload->SetupHttpRequest(HttpRequest, Url, RequestCompleteDelegate);
HttpRequest->ProcessRequest();
}
void UBUIUploader::OnRequestComplete(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{
// Did it work or not?
if (bWasSuccessful && Response.IsValid())
{
UE_LOG(LogTemp, Warning, TEXT("%s"), *Response->GetContentAsString());
if (EHttpResponseCodes::IsOk(Response->GetResponseCode()))
{
// Yay we were successful!
}
}
}