image export + file download service

This commit is contained in:
Daniel Balk 2023-04-26 16:41:05 +02:00
parent 9f8b31f9ec
commit ee4c86990a
4 changed files with 62 additions and 0 deletions

View file

@ -0,0 +1,33 @@
using System.Text;
using Microsoft.JSInterop;
namespace Moonlight.App.Services;
public class FileDownloadService
{
private readonly IJSRuntime JSRuntime;
public FileDownloadService(IJSRuntime jsRuntime)
{
JSRuntime = jsRuntime;
}
public async Task DownloadStream(string fileName, Stream stream)
{
using var streamRef = new DotNetStreamReference(stream);
await JSRuntime.InvokeVoidAsync("moonlight.downloads.downloadStream", fileName, streamRef);
}
public async Task DownloadBytes(string fileName, byte[] bytes)
{
var ms = new MemoryStream(bytes);
await DownloadStream(fileName, ms);
}
public async Task DownloadString(string fileName, string content)
{
await DownloadBytes(fileName, Encoding.UTF8.GetBytes(content));
}
}

View file

@ -105,6 +105,7 @@ namespace Moonlight
builder.Services.AddScoped<StatisticsViewService>();
builder.Services.AddSingleton<DateTimeService>();
builder.Services.AddSingleton<EventSystem>();
builder.Services.AddScoped<FileDownloadService>();
builder.Services.AddScoped<GoogleOAuth2Service>();
builder.Services.AddScoped<DiscordOAuth2Service>();

View file

@ -10,6 +10,7 @@
@inject ImageRepository ImageRepository
@inject SmartTranslateService SmartTranslateService
@inject ToastService ToastService
@inject FileDownloadService FileDownloadService
<OnlyAdmin>
<div class="row">
@ -230,6 +231,11 @@
<a href="/admin/servers/images" class="btn btn-danger me-3">
<TL>Cancel</TL>
</a>
<WButton Text="@(SmartTranslateService.Translate("Export"))"
WorkingText="@(SmartTranslateService.Translate("Exporting"))"
CssClasses="btn-primary me-3"
OnClick="Export">
</WButton>
<WButton Text="@(SmartTranslateService.Translate("Save"))"
WorkingText="@(SmartTranslateService.Translate("Saving"))"
CssClasses="btn-success"
@ -350,4 +356,13 @@
await LazyLoader.Reload();
}
private async Task Export()
{
Image.TagsJson = JsonConvert.SerializeObject(Tags);
Image.InstallScript = await Editor.GetData();
var json = JsonConvert.SerializeObject(Image, Formatting.Indented);
await FileDownloadService.DownloadString(Image.Name + ".json", json);
}
}

View file

@ -334,5 +334,18 @@
light.style.animation = "";
light.style.opacity = "0";
}
},
downloads:{
downloadStream: async function (fileName, contentStreamReference){
const arrayBuffer = await contentStreamReference.arrayBuffer();
const blob = new Blob([arrayBuffer]);
const url = URL.createObjectURL(blob);
const anchorElement = document.createElement('a');
anchorElement.href = url;
anchorElement.download = fileName ?? '';
anchorElement.click();
anchorElement.remove();
URL.revokeObjectURL(url);
}
}
};