5 votes

createReadStream ne fonctionne pas/est extrêmement lent pour les gros fichiers

J'utilise l'API DropBox pour télécharger des fichiers. Pour télécharger les fichiers vers Dropbox, je suis les étapes suivantes :

  1. Premier fichier téléchargé à partir de form dans un répertoire local du serveur.
  2. Lecture d'un fichier dans un répertoire local à l'aide de fs.createReadStream
  3. Envoyer un fichier à Dropbox via l'API Dropbox.

La question :

Pour une raison ou une autre fs.createReadStream prend une éternité lors de la lecture et du téléchargement d'un fichier volumineux. Aujourd'hui, le fichier que j'essaie de télécharger n'a qu'une taille de 12MB qui n'est pas un gros fichier et il faut environ 18 minutes pour télécharger/traiter un fichier de 12 Mo .

Je ne sais pas où se situe le problème, soit dans la createReadStream ou le code api de Dropbox.

Il fonctionne avec des fichiers dont la taille est comprise entre kb .

Mon code :

let options = {
    method: 'POST',
    uri: 'https://content.dropboxapi.com/2/files/upload',
    headers: {
        'Authorization': 'Bearer TOKEN HERE',
        'Dropbox-API-Arg': "{\"path\": \"/test/" + req.file.originalname + "\",\"mode\": \"overwrite\",\"autorename\": true,\"mute\": false}",
        'Content-Type': 'application/octet-stream'
    }, 

      // I think the issue is here.
      body: fs.createReadStream(`uploads/${req.file.originalname}`)
};

 rp(options)
    .then(() => {
        return _deleteLocalFile(req.file.originalname)
    })
    .then(() => {
        return _generateShareableLink(req.file.originalname)
    })
    .then((shareableLink) => {
        sendJsonResponse(res, 200, shareableLink)
    })
    .catch(function (err) {
        sendJsonResponse(res, 500, err)
    });

Mise à jour :

const rp = require('request-promise-native');

2voto

Glen Points 963

J'ai déjà eu une expérience similaire à ce problème et après de nombreuses recherches, j'ai pu résoudre le problème, dans mon cas en tout cas.

Pour moi, le problème est dû au fait que la taille par défaut des morceaux pour createReadStream() est assez petite (64kb) et que, pour une raison ou une autre, cela a un effet sur le téléchargement vers Dropbox.

La solution a donc consisté à augmenter la taille des morceaux.

// Try using chunks of 256kb
body: fs.createReadStream(`uploads/${req.file.originalname}`, {highWaterMark : 256 * 1024});

0voto

Rob Bruhn Points 1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X