You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 5-network/09-resume-upload/article.md
+20-20Lines changed: 20 additions & 20 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,49 +2,49 @@
2
2
3
3
Con il metodo `fetch` è abbastanza semplice eseguire l'upload di un file.
4
4
5
-
Come ripristinare l'upload di un file dopo avere perso la connessione? Non esistono opzioni built-in per questa operazione, ma abbiamo dei pezzi di codice per implementarla.
5
+
Come possiamo ripristinare l'upload di un file dopo avere perso la connessione? Non esistono opzioni built-in per questa operazione, ma abbiamo dei pezzi di codice per implementarlo.
6
6
7
-
Il ripristino degli upload dovrebbero andare a braccetto con la possibilità di tenerne traccia durante il trasferimento, come ci aspetteremmo per files di grosse dimensioni (se abbiamo bisogno di ripristinare l'operazione). Dal momento che `fetch` non permette di tenere traccia dell'upload, allora dovremmo rifarci all'uso di [XMLHttpRequest](info:xmlhttprequest).
7
+
Il ripristino degli upload dovrebbero andare a braccetto con la possibilità di tenerne traccia durante il trasferimento, come ci aspetteremmo per files di grosse dimensioni (se abbiamo bisogno di ripristinare l'operazione). Dal momento che `fetch` non permette di tenere traccia dell'upload, allora dobbiamo rifarci all'uso di [XMLHttpRequest](info:xmlhttprequest).
8
8
9
9
## Evento di progresso non-così-utile
10
10
11
-
Per ripristinare un upload, dobbiamo conoscere quanto è stato trasferito prima che la connessione si fosse interrotta.
11
+
Per ripristinare un upload, dobbiamo conoscere la quantità di dato trasferito prima che la connessione si interrompesse.
12
12
13
-
C'è `xhr.upload.onprogress` per tenere traccia del progresso di upload.
13
+
Per tenere traccia del progresso di upload possiamo usare `xhr.upload.onprogress`.
14
14
15
-
Sfortunatamene, non ci aiuta nel ripristinare l'upload, dal momento che qeusto viene scatenato quando il dato è stato *inviato*, ma è stato ricevuto dal server? Il browser non lo sa.
15
+
Sfortunatamente, quest non ci aiuta nel ripristinare l'upload, dal momento che questo evento viene scatenato solamente quando il dato è stato *inviato*. Ma è stato ricevuto dal server? Il browser non lo sa.
16
16
17
-
Magari è stato bufferizzato da qualche proxy di rete locale, o magari il processo del server remoto è stato terminato e non può più processarlo, oppure è stato perso nel bel mezzo del trasferiemnto e non raggiunge il ricevente.
17
+
Magari potrebbe essere stato bufferizzato da qualche proxy di rete locale, o magari il processo del server remoto è stato terminato e non è più in grado di processarlo, oppure è stato perso nel bel mezzo del trasferimento e non raggiunge il ricevente.
18
18
19
-
Questo è il motivo per il quale è utile solo a mostrare una carinissaima barra di caricamento.
19
+
Questo è il motivo per il quale la sua utilità si limita a mostrare una carinissima barra di caricamento.
20
20
21
-
Per riprisitnare l'upload, abbiamo bisogno di conoscere *esattamente* il numero di bytes ricevuti dal server. e solo il server può dircelo, quindi creeremo una richiesta aggiuntiva.
21
+
Per ripristinare l'upload, abbiamo bisogno di conoscere *esattamente* il numero di bytes ricevuti dal server. E questa informazione può darcela solamente il server, motivo per il quale andiamo a creare una richiesta aggiuntiva.
22
22
23
23
## Algoritmo
24
24
25
-
1. Per prima cosa, creiamo un id del file, per identificare univocamente il file che stiamo andando a trasferire:
25
+
1. Per prima cosa, creiamo un id del file, per identificare univocamente ciò che stiamo andando a trasferire:
26
26
```js
27
27
let fileId =file.name+'-'+file.size+'-'+file.lastModified;
28
28
```
29
29
Ciò è necessario per ripristinare l'upload, per dire al server cosa stiamo ripristinando.
30
30
31
-
Se il nome, la dimensione oppure la data di ultima modifica sono differenti, allora ci sarà un altro `fileId`.
31
+
Se il nome, la dimensione, oppure la data di ultima modifica sono differenti, allora ci sarà un `fileId` differente.
32
32
33
-
2. Inviamo una richiesta al server, chiedendo quanti bytes possiede già:
33
+
2. Inviamo una richiesta al server, chiedendo quanti bytes possiede già di quel file:
34
34
```js
35
35
let response = await fetch('status', {
36
36
headers: {
37
37
'X-File-Id': fileId
38
38
}
39
39
});
40
40
41
-
// Il serve possiede questo numero di bytes
41
+
// Il server possiede questo numero di bytes
42
42
let startByte = +await response.text();
43
43
```
44
44
45
-
Questo presume che il server tiene traccia degli upload dei files tramite l'header `X-File-Id`. Dovrebbe essere implmentato lato server.
45
+
Questo presume che il server tenga traccia degli upload dei files tramite l'header `X-File-Id`. Dovrebbe essere implementato lato server.
46
46
47
-
Se il file non essite ancora nel server, allora la risposta del server dovrebbe essere `0`
47
+
Se il file non esiste ancora nel server, il valore della risposta dovrebbe essere `0`
48
48
49
49
3. Quindi, possiamo usare il metodo `slice` di `Blob` per inviare il file partendo da `startByte`:
50
50
```js
@@ -53,20 +53,20 @@ Per riprisitnare l'upload, abbiamo bisogno di conoscere *esattamente* il numero
53
53
// File id, in modo tale che il server possa sapere di quale file stiamo eseguendo l'upload
54
54
xhr.setRequestHeader('X-File-Id', fileId);
55
55
56
-
// Il byte a partire dal quale stiamo eseguendo il ripristino, in moda da consentire al server di sapre da che punto stiamo cominciando a ripristinare
56
+
// Il byte a partire dal quale stiamo eseguendo il ripristino, in modo da consentire al server di sapere da che punto stiamo cominciando a ripristinare
57
57
xhr.setRequestHeader('X-Start-Byte', startByte);
58
58
59
59
xhr.upload.onprogress = (e) => {
60
60
console.log(`Uploaded ${startByte +e.loaded} of ${startByte +e.total}`);
61
61
};
62
62
63
-
// il file può provenire da input.files[0] o altra fonte
63
+
// il file puo' provenire da input.files[0] o da altra fonte
64
64
xhr.send(file.slice(startByte));
65
65
```
66
66
67
-
Qui inviamo al server sia il file id come `X-File-Id`, di modo che sappia quae file stiamo trasferendo, e da quale byte staimo ripartendo tramite `X-Start-Byte`, cosicché sappia che non stiamo partendo dall'inizio, ma che staimo, invece, ripristinando.
67
+
Qui inviamo al server sia il file id come `X-File-Id`, di modo che sappia quale file stiamo trasferendo, e da quale byte stiamo ripartendo tramite `X-Start-Byte`, cosicché sappia che non stiamo partendo dall'inizio, ma che, invece, stiamo ripristinando.
68
68
69
-
Il sefver dovrebbe controllare i suoi registri, e nel caso in cui trovasse un upload di quest file, e la dimensione attualemnte caricata fosse esattaemnte di `X-Start-Byte`, allora accoderebbe i dati a qeusto file.
69
+
Il server dovrebbe controllare i suoi registri, e nel caso in cui trovasse un upload del file, e la dimensione attualmente caricata fosse esattamente di `X-Start-Byte`, accoderebbe i dati al file.
70
70
71
71
72
72
Ecco una demo con il codice client e la relativa parte server, scritta in Node.js.
@@ -77,6 +77,6 @@ Funziona parzialmente su questo sito, dal momento che Node.js sta su un altro se
77
77
78
78
[codetabs src="upload-resume" height=200]
79
79
80
-
Come possiamo vedere, i moderni metodi di rete sono molto vicini dall'essere dei gestori di files nelle loro capacità, controllo degli headers, indicazione del progresso di upload, invio di frammenti di files etc.
80
+
Come possiamo vedere, i moderni metodi di rete sono molto vicini all'essere dei gestori di files nelle loro capacità, controllo degli headers, indicazione del progresso di upload, invio di frammenti di files etc.
81
81
82
-
Possiamo implementare upload ripristinabili e molto altro ancora.
82
+
Possiamo implementare, quindi, upload ripristinabili e molto altro ancora.
0 commit comments