Invia i log a parti e chiedi se includere le foto

Le foto venivano zippate tutte in un unico allegato: oltre i 100 MB i servizi
rifiutavano l'invio (MaxUploadSizeExceededException) e, costruendo tutto in RAM
sul thread della UI, il dispositivo si bloccava.

- Invio diviso in più email da massimo ~40 MB ciascuna
- Zip scritti su disco una parte alla volta e caricati in streaming
- Preparazione in background, avanzamento "parte X di N"
- Richiesta se includere le foto, con il loro peso (default: solo i log)
- Database inviato insieme al file -wal
- Avviso subito se si è offline

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
MarcoEandClaude Opus 5.5 committed 2026-09-28 12:10:19 +02:00
1 parent a4e5709be6
commit 9799f6b0c7
9 files changed
+403 -183

No files matched your search

@@ -0,0 +1,39 @@
using System.Net;
using System.Net.Http.Headers;
namespace SteUp.Shared.Core.Helpers;
/// <summary>
/// Contenuto HTTP letto dal file durante l'invio, senza caricarlo in RAM. Il file viene riaperto
/// a ogni serializzazione, così regge anche un eventuale nuovo tentativo del client
/// (es. dopo il refresh del token).
/// </summary>
public sealed class FileHttpContent : HttpContent
{
private const int BufferSize = 81920;
private readonly string _path;
public FileHttpContent(string path, string mediaType)
{
_path = path;
Headers.ContentType = new MediaTypeHeaderValue(mediaType);
}
protected override Task SerializeToStreamAsync(Stream stream, TransportContext? context) =>
SerializeToStreamAsync(stream, context, CancellationToken.None);
protected override async Task SerializeToStreamAsync(Stream stream, TransportContext? context,
CancellationToken cancellationToken)
{
await using var file = new FileStream(_path, FileMode.Open, FileAccess.Read, FileShare.Read,
BufferSize, useAsync: true);
await file.CopyToAsync(stream, BufferSize, cancellationToken);
}
protected override bool TryComputeLength(out long length)
{
length = new FileInfo(_path).Length;
return true;
}
}