++ fix restore backup

This commit is contained in:
2026-07-29 17:56:52 +02:00
parent 7ac454cd25
commit 8dee7b1f44
9 changed files with 237 additions and 24 deletions

View File

@@ -21,6 +21,32 @@ use Illuminate\Support\Str;
*/
class BackupController extends Controller
{
/**
* Tetto per il pacchetto in ingresso, in kilobyte.
*
* Deriva da `app.max_upload_mb`, da cui l'entrypoint ricava anche i limiti
* di nginx e di PHP. Il valore qui sta *sotto* quelli di un margine: se a
* fermare la richiesta e' nginx, il browser riceve un 413 senza corpo — o
* niente affatto — invece di un messaggio; se la ferma la validazione, chi
* carica legge cosa e' successo. Il margine copre anche l'intestazione
* multipart, che gonfia il corpo oltre la dimensione del file.
*
* La vista lo legge da qui per rifiutare il file prima ancora di iniziare a
* caricarlo: una sola fonte per un solo numero.
*/
public static function maxUploadKb(): int
{
$mb = max(1, (int) config('app.max_upload_mb', 2048));
// 2% di margine, minimo 1 MB, per l'incapsulamento multipart.
return (int) (($mb - max(1, (int) ($mb * 0.02))) * 1000);
}
public static function maxUploadMb(): int
{
return (int) (self::maxUploadKb() / 1000);
}
public function __construct(
private readonly BackupOperationState $stato,
) {
@@ -76,16 +102,12 @@ class BackupController extends Controller
*/
public function upload(Request $request)
{
// 256 MB e' il tetto reale della pila, non una scelta di questa
// validazione: piu' in su intervengono prima `client_max_body_size` di
// nginx e `upload_max_filesize`/`post_max_size` di PHP, che rifiutano
// la richiesta con un 413 opaco invece di un messaggio leggibile.
$request->validate([
'backupZip' => ['required', 'file', 'mimes:zip', 'max:256000'],
'backupZip' => ['required', 'file', 'mimes:zip', 'max:' . self::maxUploadKb()],
], [
'backupZip.required' => 'Seleziona il pacchetto di backup da ripristinare.',
'backupZip.mimes' => 'Il pacchetto di backup deve essere un file .zip.',
'backupZip.max' => 'Il pacchetto supera i 256 MB accettati dal server.',
'backupZip.max' => 'Il pacchetto supera i ' . self::maxUploadMb() . ' MB accettati dal server.',
]);
// Stesso blocco del componente Livewire, ripetuto qui perche' questa e'