forked from Kieran/void.cat
zz
This commit is contained in:
parent
b68f19c1b9
commit
afee82fed9
4
.gitignore
vendored
4
.gitignore
vendored
@ -11,4 +11,6 @@ Release/
|
|||||||
node_modules/
|
node_modules/
|
||||||
package-lock.json
|
package-lock.json
|
||||||
out/
|
out/
|
||||||
sw.js
|
sw.js
|
||||||
|
.DS_Store
|
||||||
|
.idea/
|
||||||
|
22
Dockerfile
Normal file
22
Dockerfile
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
#install npm
|
||||||
|
RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash -
|
||||||
|
RUN apt-get install -y nodejs
|
||||||
|
|
||||||
|
#run yarn install
|
||||||
|
COPY VoidCat/spa/package.json VoidCat/spa/yarn.lock spa/
|
||||||
|
RUN cd spa && npx yarn install
|
||||||
|
|
||||||
|
# Copy everything else and build
|
||||||
|
COPY VoidCat .
|
||||||
|
RUN rm -rf appsettings.*.json
|
||||||
|
RUN dotnet publish -c Release -o out VoidCat.csproj
|
||||||
|
|
||||||
|
# Build runtime image
|
||||||
|
FROM mcr.microsoft.com/dotnet/aspnet:6.0
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=build-env /app/out .
|
||||||
|
ENTRYPOINT ["dotnet", "VoidCat.dll"]
|
@ -1,5 +1,4 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using System.Buffers;
|
|
||||||
using VoidCat.Model;
|
using VoidCat.Model;
|
||||||
using VoidCat.Services;
|
using VoidCat.Services;
|
||||||
|
|
||||||
@ -8,32 +7,20 @@ namespace VoidCat.Controllers
|
|||||||
[Route("upload")]
|
[Route("upload")]
|
||||||
public class UploadController : Controller
|
public class UploadController : Controller
|
||||||
{
|
{
|
||||||
|
private readonly IFileIngressFactory _fileIngress;
|
||||||
private readonly IStatsCollector _stats;
|
private readonly IStatsCollector _stats;
|
||||||
|
|
||||||
public UploadController(IStatsCollector stats)
|
public UploadController(IStatsCollector stats, IFileIngressFactory fileIngress)
|
||||||
{
|
{
|
||||||
_stats = stats;
|
_stats = stats;
|
||||||
|
_fileIngress = fileIngress;
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public Task<VoidFile> UploadFile()
|
public Task<VoidFile> UploadFile()
|
||||||
{
|
{
|
||||||
return Request.HasFormContentType ?
|
return Request.HasFormContentType ?
|
||||||
saveFromForm() : saveFromBody();
|
saveFromForm() : _fileIngress.Ingress(Request.Body);
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<VoidFile> saveFromBody()
|
|
||||||
{
|
|
||||||
var temp = Path.GetTempFileName();
|
|
||||||
using var fsTemp = new FileStream(temp, FileMode.Create, FileAccess.ReadWrite);
|
|
||||||
|
|
||||||
var buffer = MemoryPool<byte>.Shared.Rent();
|
|
||||||
var rlen = 0;
|
|
||||||
while ((rlen = await Request.Body.ReadAsync(buffer.Memory)) > 0)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
return default;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task<VoidFile> saveFromForm()
|
private Task<VoidFile> saveFromForm()
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
|
|
||||||
|
|
||||||
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
|
|
||||||
WORKDIR /app
|
|
||||||
EXPOSE 80
|
|
||||||
EXPOSE 443
|
|
||||||
|
|
||||||
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
|
|
||||||
WORKDIR /src
|
|
||||||
COPY ["VoidCat/VoidCat.csproj", "VoidCat/"]
|
|
||||||
RUN dotnet restore "VoidCat/VoidCat.csproj"
|
|
||||||
COPY . .
|
|
||||||
WORKDIR "/src/VoidCat"
|
|
||||||
RUN dotnet build "VoidCat.csproj" -c Release -o /app/build
|
|
||||||
|
|
||||||
FROM build AS publish
|
|
||||||
RUN dotnet publish "VoidCat.csproj" -c Release -o /app/publish
|
|
||||||
|
|
||||||
FROM base AS final
|
|
||||||
WORKDIR /app
|
|
||||||
COPY --from=publish /app/publish .
|
|
||||||
ENTRYPOINT ["dotnet", "VoidCat.dll"]
|
|
@ -1,10 +1,13 @@
|
|||||||
using VoidCat;
|
using VoidCat.Model;
|
||||||
|
using VoidCat.Services;
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
var services = builder.Services;
|
var services = builder.Services;
|
||||||
services.AddRouting();
|
services.AddRouting();
|
||||||
services.AddControllers();
|
services.AddControllers();
|
||||||
|
services.AddScoped<IFileIngressFactory, LocalDiskFileIngressFactory>();
|
||||||
|
services.AddScoped<IStatsCollector, InMemoryStatsCollector>();
|
||||||
|
|
||||||
var configuration = builder.Configuration;
|
var configuration = builder.Configuration;
|
||||||
var voidSettings = configuration.GetSection("Settings").Get<VoidSettings>();
|
var voidSettings = configuration.GetSection("Settings").Get<VoidSettings>();
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
namespace VoidCat.Services
|
using VoidCat.Model;
|
||||||
|
|
||||||
|
namespace VoidCat.Services
|
||||||
{
|
{
|
||||||
public interface IFileIngressFactory
|
public interface IFileIngressFactory
|
||||||
{
|
{
|
||||||
|
Task<VoidFile> Ingress(Stream inStream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
15
VoidCat/Services/InMemoryStatsCollector.cs
Normal file
15
VoidCat/Services/InMemoryStatsCollector.cs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
namespace VoidCat.Services
|
||||||
|
{
|
||||||
|
public class InMemoryStatsCollector : IStatsCollector
|
||||||
|
{
|
||||||
|
public ValueTask TrackIngress(Guid id, ulong amount)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ValueTask TrackEgress(Guid id, ulong amount)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
42
VoidCat/Services/LocalDiskFileIngressFactory.cs
Normal file
42
VoidCat/Services/LocalDiskFileIngressFactory.cs
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
using System.Buffers;
|
||||||
|
using VoidCat.Model;
|
||||||
|
|
||||||
|
namespace VoidCat.Services;
|
||||||
|
|
||||||
|
public class LocalDiskFileIngressFactory : IFileIngressFactory
|
||||||
|
{
|
||||||
|
private readonly VoidSettings _settings;
|
||||||
|
private readonly IStatsCollector _stats;
|
||||||
|
|
||||||
|
public LocalDiskFileIngressFactory(VoidSettings settings, IStatsCollector stats)
|
||||||
|
{
|
||||||
|
_settings = settings;
|
||||||
|
_stats = stats;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<VoidFile> Ingress(Stream inStream)
|
||||||
|
{
|
||||||
|
var id = Guid.NewGuid();
|
||||||
|
var fPath = mapPath(id);
|
||||||
|
using var fsTemp = new FileStream(fPath, FileMode.Create, FileAccess.ReadWrite);
|
||||||
|
|
||||||
|
var buffer = MemoryPool<byte>.Shared.Rent();
|
||||||
|
var total = 0UL;
|
||||||
|
var readLength = 0;
|
||||||
|
while ((readLength = await inStream.ReadAsync(buffer.Memory)) > 0)
|
||||||
|
{
|
||||||
|
await fsTemp.WriteAsync(buffer.Memory[..readLength]);
|
||||||
|
await _stats.TrackIngress(id, (ulong)readLength);
|
||||||
|
total += (ulong)readLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new()
|
||||||
|
{
|
||||||
|
Id = id,
|
||||||
|
Size = total
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private string mapPath(Guid id) =>
|
||||||
|
Path.Join(_settings.FilePath, id.ToString());
|
||||||
|
}
|
@ -1,6 +0,0 @@
|
|||||||
namespace VoidCat.Services
|
|
||||||
{
|
|
||||||
public class StatsCollector
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
@ -17,6 +17,9 @@
|
|||||||
<!-- Don't publish the SPA source files, but do show them in the project files list -->
|
<!-- Don't publish the SPA source files, but do show them in the project files list -->
|
||||||
<Content Remove="$(SpaRoot)**" />
|
<Content Remove="$(SpaRoot)**" />
|
||||||
<Content Include="$(SolutionDir).github\workflows\build.yml" />
|
<Content Include="$(SolutionDir).github\workflows\build.yml" />
|
||||||
|
<Content Include="..\Dockerfile">
|
||||||
|
<Link>Dockerfile</Link>
|
||||||
|
</Content>
|
||||||
<None Remove="$(SpaRoot)**" />
|
<None Remove="$(SpaRoot)**" />
|
||||||
<None Include="$(SpaRoot)**" Exclude="$(SpaRoot)node_modules\**" />
|
<None Include="$(SpaRoot)**" Exclude="$(SpaRoot)node_modules\**" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -1,9 +1,13 @@
|
|||||||
import './App.css';
|
import './App.css';
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
|
|
||||||
|
function selectFiles(e) {
|
||||||
|
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<div className="app">
|
<div className="app">
|
||||||
<div className="drop">
|
<div className="drop" onClick={selectFiles}>
|
||||||
<h3>Drop files here!</h3>
|
<h3>Drop files here!</h3>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user