++ fix restore backup
This commit is contained in:
@@ -41,11 +41,42 @@
|
||||
// Svuotato subito: se la password è sbagliata si ridigita, e nel
|
||||
// frattempo non resta nel campo di una scheda lasciata aperta.
|
||||
this.passwordAzzeramento = '';
|
||||
$wire.confermaAzzeramento(password);
|
||||
// this.$wire e non $wire: dentro un metodo di x-data la forma
|
||||
// esplicita e' l'unica su cui si possa contare.
|
||||
this.$wire.confermaAzzeramento(password);
|
||||
},
|
||||
|
||||
/**
|
||||
* Il file e' troppo grande? Si scopre qui, prima di caricare.
|
||||
*
|
||||
* Superato il tetto, e' nginx a chiudere la connessione a meta'
|
||||
* trasferimento: la barra si pianta a una percentuale qualsiasi e non
|
||||
* arriva nessun evento utile, quindi la pagina resta muta con l'aria di
|
||||
* essersi bloccata. Controllare la dimensione prima di partire rende
|
||||
* quel caso un messaggio immediato invece di un'attesa senza fine.
|
||||
*/
|
||||
zipTroppoGrande(file) {
|
||||
const maxByte = {{ \App\Http\Controllers\Settings\BackupController::maxUploadKb() }} * 1000;
|
||||
|
||||
if (!file || file.size <= maxByte) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const mb = (n) => (n / 1000000).toFixed(0);
|
||||
this.erroreUpload = `Il pacchetto pesa ${mb(file.size)} MB e supera il limite di ${mb(maxByte)} MB accettato dal server. `
|
||||
+ `Per archivi piu' grandi usa il ripristino dai volumi descritto nel README, oppure chiedi di alzare il limite.`;
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
inviaRipristino(event) {
|
||||
const form = event.target;
|
||||
const file = form.querySelector('input[name=backupZip]').files[0];
|
||||
|
||||
if (this.zipTroppoGrande(file)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const formData = new FormData(form);
|
||||
|
||||
this.erroreUpload = '';
|
||||
@@ -57,6 +88,11 @@
|
||||
xhr.setRequestHeader('Accept', 'application/json');
|
||||
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
||||
|
||||
// Un caricamento che non si muove per cinque minuti e' fermo, non
|
||||
// lento: senza questo non scatterebbe piu' nessun evento e la
|
||||
// pagina resterebbe in attesa per sempre.
|
||||
xhr.timeout = 300000;
|
||||
|
||||
xhr.upload.addEventListener('progress', (e) => {
|
||||
if (e.lengthComputable) {
|
||||
this.uploadPercento = Math.round((e.loaded / e.total) * 100);
|
||||
@@ -73,25 +109,64 @@
|
||||
this.zipSelezionato = '';
|
||||
form.reset();
|
||||
// Da qui in poi l'avanzamento arriva dal job, non dall'upload.
|
||||
$wire.seguiOperazione(payload.operation_id);
|
||||
this.$wire.seguiOperazione(payload.operation_id);
|
||||
return;
|
||||
}
|
||||
|
||||
// 409: c'è già un'operazione in corso. Il pacchetto è stato
|
||||
// caricato per niente, quindi la barra torna a zero: lasciarla
|
||||
// al 100% farebbe credere che il ripristino sia partito.
|
||||
// Qualsiasi esito diverso: la barra torna a zero, perche'
|
||||
// lasciarla dov'era farebbe credere che il ripristino sia
|
||||
// partito. Il codice HTTP entra nel messaggio: 413 e 419 non
|
||||
// producono un corpo JSON, quindi senza di esso resterebbe solo
|
||||
// un generico "errore" che non dice cosa fare.
|
||||
this.uploadPercento = 0;
|
||||
this.erroreUpload = payload.message
|
||||
|| (payload.errors && payload.errors.backupZip ? payload.errors.backupZip[0] : 'Errore durante il caricamento del pacchetto.');
|
||||
this.erroreUpload = this.messaggioErrore(xhr.status, payload);
|
||||
});
|
||||
|
||||
xhr.addEventListener('error', () => {
|
||||
this.uploadInCorso = false;
|
||||
this.erroreUpload = 'Errore di rete durante il caricamento del pacchetto.';
|
||||
this.uploadPercento = 0;
|
||||
this.erroreUpload = 'Errore di rete durante il caricamento: connessione interrotta dal server. '
|
||||
+ 'Succede tipicamente quando il pacchetto supera il limite accettato.';
|
||||
});
|
||||
|
||||
xhr.addEventListener('timeout', () => {
|
||||
this.uploadInCorso = false;
|
||||
this.uploadPercento = 0;
|
||||
this.erroreUpload = 'Il caricamento non ha risposto entro 5 minuti ed e\\' stato interrotto.';
|
||||
});
|
||||
|
||||
xhr.addEventListener('abort', () => {
|
||||
this.uploadInCorso = false;
|
||||
this.uploadPercento = 0;
|
||||
this.erroreUpload = 'Caricamento annullato.';
|
||||
});
|
||||
|
||||
xhr.send(formData);
|
||||
},
|
||||
|
||||
messaggioErrore(status, payload) {
|
||||
if (payload.message) {
|
||||
return payload.message;
|
||||
}
|
||||
|
||||
if (payload.errors && payload.errors.backupZip) {
|
||||
return payload.errors.backupZip[0];
|
||||
}
|
||||
|
||||
if (status === 413) {
|
||||
return 'Il pacchetto e\\' troppo grande per il server (413). Alza client_max_body_size in nginx e post_max_size in PHP, oppure usa il ripristino dai volumi.';
|
||||
}
|
||||
|
||||
if (status === 419) {
|
||||
return 'Sessione scaduta durante il caricamento. Ricarica la pagina e riprova.';
|
||||
}
|
||||
|
||||
if (status === 0) {
|
||||
return 'Il server ha chiuso la connessione durante il caricamento, senza rispondere. Di solito significa che il pacchetto supera il limite accettato.';
|
||||
}
|
||||
|
||||
return `Errore durante il caricamento del pacchetto (HTTP ${status}).`;
|
||||
},
|
||||
}"
|
||||
x-on:scarica-backup.window="window.location.href = $event.detail.url">
|
||||
|
||||
@@ -262,10 +337,22 @@
|
||||
@submit.prevent="if (confirm('Confermi il ripristino? I dati gestionali e i file correnti verranno sostituiti, e tutti gli utenti dovranno impostare una nuova password.')) inviaRipristino($event)">
|
||||
@csrf
|
||||
<div>
|
||||
{{-- La dimensione si controlla gia' alla selezione: sapere
|
||||
subito che il file e' fuori limite evita di aspettare un
|
||||
caricamento destinato a essere tagliato. --}}
|
||||
<input name="backupZip" type="file" accept=".zip,application/zip"
|
||||
x-on:change="zipSelezionato = $event.target.files[0] ? $event.target.files[0].name : ''; erroreUpload = ''"
|
||||
x-on:change="
|
||||
erroreUpload = '';
|
||||
uploadPercento = 0;
|
||||
const f = $event.target.files[0];
|
||||
zipSelezionato = f ? f.name + ' (' + (f.size / 1000000).toFixed(1) + ' MB)' : '';
|
||||
if (f) zipTroppoGrande(f);
|
||||
"
|
||||
class="block w-full text-sm text-gray-600 file:mr-3 file:py-2 file:px-4 file:rounded-lg file:border-0 file:text-sm file:font-medium file:bg-red-50 file:text-red-700 hover:file:bg-red-100">
|
||||
<p x-show="erroreUpload" x-cloak class="text-red-500 text-xs mt-1" x-text="erroreUpload"></p>
|
||||
<p class="mt-1 text-xs text-gray-500">
|
||||
Dimensione massima accettata: {{ \App\Http\Controllers\Settings\BackupController::maxUploadMb() }} MB.
|
||||
</p>
|
||||
<p x-show="erroreUpload" x-cloak class="text-red-600 text-xs mt-1 font-medium" x-text="erroreUpload"></p>
|
||||
</div>
|
||||
|
||||
{{-- Caricamento: percentuale reale dell'upload, non del ripristino. --}}
|
||||
|
||||
Reference in New Issue
Block a user