image export + file download service
This commit is contained in:
33
Moonlight/App/Services/FileDownloadService.cs
Normal file
33
Moonlight/App/Services/FileDownloadService.cs
Normal 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -105,6 +105,7 @@ namespace Moonlight
|
|||||||
builder.Services.AddScoped<StatisticsViewService>();
|
builder.Services.AddScoped<StatisticsViewService>();
|
||||||
builder.Services.AddSingleton<DateTimeService>();
|
builder.Services.AddSingleton<DateTimeService>();
|
||||||
builder.Services.AddSingleton<EventSystem>();
|
builder.Services.AddSingleton<EventSystem>();
|
||||||
|
builder.Services.AddScoped<FileDownloadService>();
|
||||||
|
|
||||||
builder.Services.AddScoped<GoogleOAuth2Service>();
|
builder.Services.AddScoped<GoogleOAuth2Service>();
|
||||||
builder.Services.AddScoped<DiscordOAuth2Service>();
|
builder.Services.AddScoped<DiscordOAuth2Service>();
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
@inject ImageRepository ImageRepository
|
@inject ImageRepository ImageRepository
|
||||||
@inject SmartTranslateService SmartTranslateService
|
@inject SmartTranslateService SmartTranslateService
|
||||||
@inject ToastService ToastService
|
@inject ToastService ToastService
|
||||||
|
@inject FileDownloadService FileDownloadService
|
||||||
|
|
||||||
<OnlyAdmin>
|
<OnlyAdmin>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -230,6 +231,11 @@
|
|||||||
<a href="/admin/servers/images" class="btn btn-danger me-3">
|
<a href="/admin/servers/images" class="btn btn-danger me-3">
|
||||||
<TL>Cancel</TL>
|
<TL>Cancel</TL>
|
||||||
</a>
|
</a>
|
||||||
|
<WButton Text="@(SmartTranslateService.Translate("Export"))"
|
||||||
|
WorkingText="@(SmartTranslateService.Translate("Exporting"))"
|
||||||
|
CssClasses="btn-primary me-3"
|
||||||
|
OnClick="Export">
|
||||||
|
</WButton>
|
||||||
<WButton Text="@(SmartTranslateService.Translate("Save"))"
|
<WButton Text="@(SmartTranslateService.Translate("Save"))"
|
||||||
WorkingText="@(SmartTranslateService.Translate("Saving"))"
|
WorkingText="@(SmartTranslateService.Translate("Saving"))"
|
||||||
CssClasses="btn-success"
|
CssClasses="btn-success"
|
||||||
@@ -350,4 +356,13 @@
|
|||||||
|
|
||||||
await LazyLoader.Reload();
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -334,5 +334,18 @@
|
|||||||
light.style.animation = "";
|
light.style.animation = "";
|
||||||
light.style.opacity = "0";
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Reference in New Issue
Block a user