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>
40 lines
1.3 KiB
C#
40 lines
1.3 KiB
C#
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;
|
|
}
|
|
}
|