image export + file download service
This commit is contained in:
parent
9f8b31f9ec
commit
ee4c86990a
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.AddSingleton<DateTimeService>();
|
||||
builder.Services.AddSingleton<EventSystem>();
|
||||
builder.Services.AddScoped<FileDownloadService>();
|
||||
|
||||
builder.Services.AddScoped<GoogleOAuth2Service>();
|
||||
builder.Services.AddScoped<DiscordOAuth2Service>();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
};
|
Loading…
Reference in a new issue