Skip to content

Commit 5de9f88

Browse files
authored
Merge pull request #153 from HachemiH/master
Resumable file upload
2 parents 958bb73 + 0b417d4 commit 5de9f88

File tree

1 file changed

+30
-30
lines changed

1 file changed

+30
-30
lines changed

5-network/09-resume-upload/article.md

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,82 @@
1-
# Resumable file upload
1+
# Upload pouvant être repris
22

3-
With `fetch` method it's fairly easy to upload a file.
3+
Avec la méthode `fetch`, il est assez facile de upload un fichier.
44

5-
How to resume the upload after lost connection? There's no built-in option for that, but we have the pieces to implement it.
5+
Comment reprendre l'upload après une perte de connexion ? Il n'y a pas d'option intégrée pour cela, mais nous avons les pièces pour l'implémenter.
66

7-
Resumable uploads should come with upload progress indication, as we expect big files (if we may need to resume). So, as `fetch` doesn't allow to track upload progress, we'll use [XMLHttpRequest](info:xmlhttprequest).
7+
Les uploads pouvant être repris devraient être accompagnés d'une indication de progression, puisque nous pouvons nous attendre à de gros fichiers (au cas où on devrait reprendre). Donc, comme `fetch` ne permet pas de suivre la progression du téléchargement, nous utiliserons [XMLHttpRequest](info:xmlhttprequest).
88

9-
## Not-so-useful progress event
9+
## Événement de progression pas si utile
1010

11-
To resume upload, we need to know how much was uploaded till the connection was lost.
11+
Pour reprendre l'upload, nous devons savoir combien a été uploadé jusqu'à ce que la connexion soit perdue.
1212

13-
There's `xhr.upload.onprogress` to track upload progress.
13+
Il y a `xhr.upload.onprogress` pour suivre la progression de l'upload.
1414

15-
Unfortunately, it won't help us to resume the upload here, as it triggers when the data is *sent*, but was it received by the server? The browser doesn't know.
15+
Malheureusement, cela ne nous aidera pas à reprendre l'upload ici, car cela ne se déclenche que lorsque les données sont *envoyées*, mais est-ce que le serveur l'a reçu ? Le navigateur ne sait pas.
1616

17-
Maybe it was buffered by a local network proxy, or maybe the remote server process just died and couldn't process them, or it was just lost in the middle and didn't reach the receiver.
17+
Peut-être que cela a été mis en mémoire tampon par un proxy de réseau local, ou peut-être que le processus du serveur distant vient de mourir et n'a pas pu les traiter, ou cela a juste été perdu au milieu et n'a pas atteint le destinataire.
1818

19-
That's why this event is only useful to show a nice progress bar.
19+
C'est pourquoi cet événement n'est utile que pour afficher une belle barre de progression.
2020

21-
To resume upload, we need to know *exactly* the number of bytes received by the server. And only the server can tell that, so we'll make an additional request.
21+
Pour reprendre l'upload, nous devons connaître *exactement* le nombre d'octets reçus par le serveur. Et seul le serveur peut le dire, nous ferons donc une demande supplémentaire.
2222

23-
## Algorithm
23+
## Algorithme
2424

25-
1. First, create a file id, to uniquely identify the file we're going to upload:
25+
1. Créer d'abord un identifiant de fichier pour identifier de manière unique le fichier que nous allons uploader :
2626
```js
2727
let fileId = file.name + '-' + file.size + '-' + +file.lastModifiedDate;
2828
```
29-
That's needed for resume upload, to tell the server what we're resuming.
29+
Cela est nécessaire pour reprendre l'upload, pour indiquer au serveur ce que nous reprenons.
3030
31-
If the name or the size or the last modification date changes, then there'll be another `fileId`.
31+
Si le nom ou la taille ou la dernière date de modification change, alors il y aura un autre `fileId`.
3232
33-
2. Send a request to the server, asking how many bytes it already has, like this:
33+
2. Envoyer une demande au serveur, lui demandant combien d'octets il possède déjà, comme ceci :
3434
```js
3535
let response = await fetch('status', {
3636
headers: {
3737
'X-File-Id': fileId
3838
}
3939
});
4040
41-
// The server has that many bytes
41+
// Le serveur a autant d'octets
4242
let startByte = +await response.text();
4343
```
4444

45-
This assumes that the server tracks file uploads by `X-File-Id` header. Should be implemented at server-side.
45+
Cela suppose que le serveur effectue le suivi des uploads de fichiers par l'en-tête `X-File-Id`. Doit être implémenté côté serveur.
4646
47-
If the file don't yet exist at the server, then the server response should be `0`
47+
Si le fichier n'existe pas encore sur le serveur, la réponse du serveur doit être `0`.
4848

49-
3. Then, we can use `Blob` method `slice` to send the file from `startByte`:
49+
3. Ensuite, nous pouvons utiliser un `Blob` par la méhtode `slice` pour envoyer le fichier depuis `startByte` :
5050
```js
5151
xhr.open("POST", "upload", true);
5252
53-
// File id, so that the server knows which file we upload
53+
// Identifiant du fichier, afin que le serveur sache quel fichier nous uploadons
5454
xhr.setRequestHeader('X-File-Id', fileId);
5555
56-
// The byte we're resuming from, so the server knows we're resuming
56+
// L'octet à partir duquel nous reprenons, donc le serveur sait que nous reprenons
5757
xhr.setRequestHeader('X-Start-Byte', startByte);
5858
5959
xhr.upload.onprogress = (e) => {
6060
console.log(`Uploaded ${startByte + e.loaded} of ${startByte + e.total}`);
6161
};
6262
63-
// file can be from input.files[0] or another source
63+
// le fichier peut provenir de input.files[0] ou d'une autre source
6464
xhr.send(file.slice(startByte));
6565
```
6666

67-
Here we send the server both file id as `X-File-Id`, so it knows which file we're uploading, and the starting byte as `X-Start-Byte`, so it knows we're not uploading it initially, but resuming.
67+
Ici, nous envoyons au serveur à la fois l'ID du fichier en tant que `X-File-Id`, afin qu'il sache quel fichier nous uploadons, et l'octet de départ en tant que `X-Start-Byte`, afin qu'il sache que nous ne l'uploadons pas de zéro, mais en reprenant.
6868
69-
The server should check its records, and if there was an upload of that file, and the current uploaded size is exactly `X-Start-Byte`, then append the data to it.
69+
Le serveur doit vérifier ses enregistrements et s'il y a eu un upload de ce fichier et que la taille actuellement téléchargée est exactement `X-Start-Byte`, alors il y ajoute les données.
7070

7171

72-
Here's the demo with both client and server code, written on Node.js.
72+
Voici la démo avec le code client et serveur, écrite sur Node.js.
7373

74-
It works only partially on this site, as Node.js is behind another server named Nginx, that buffers uploads, passing them to Node.js when fully complete.
74+
Cela ne fonctionne que partiellement sur ce site, car Node.js est derrière un autre serveur nommé Nginx, qui met en mémoire tampon les uploads, en les transmettant à Node.js que lorsqu'il est complètement terminé.
7575
76-
But you can download it and run locally for the full demonstration:
76+
Mais vous pouvez le télécharger et l'exécuter localement pour la démonstration complète :
7777

7878
[codetabs src="upload-resume" height=200]
7979

80-
As we can see, modern networking methods are close to file managers in their capabilities -- control over headers, progress indicator, sending file parts, etc.
80+
Comme nous pouvons le voir, les méthodes de mise en réseau modernes sont proches des gestionnaires de fichiers dans leurs capacités - contrôle des en-têtes, indicateur de progression, envoi de parties de fichier, etc...
8181

82-
We can implement resumable upload and much more.
82+
Nous pouvons implémenter un upload pouvant être repris et bien plus encore.

0 commit comments

Comments
 (0)