Maison  >  Article  >  interface Web  >  Téléchargement de la reprise du segment Node.JS : méthode d'implémentation du téléchargement du segment du fichier de configuration Nginx function_node.js

Téléchargement de la reprise du segment Node.JS : méthode d'implémentation du téléchargement du segment du fichier de configuration Nginx function_node.js

亚连
亚连original
2018-05-31 09:58:372299parcourir

Cette balise peut être configurée dans Node.JS pour implémenter le téléchargement segmenté de fichiers. Cet article vous présente le téléchargement segmenté Node.JS : comment implémenter la fonction de téléchargement segmenté des fichiers de configuration Nginx. Les amis qui en ont besoin peuvent s'y référer

Html5 fournit une nouvelle balise Range pour implémenter le téléchargement du fichier. parties. Cette balise peut être configurée dans Node.JS pour implémenter le téléchargement segmenté de fichiers.

Balise d'en-tête

En-tête de demande : télécharger le contenu du fichier après 3744

range: bytes=3744-

En-tête de réponse de retour : longueur totale du fichier 15522643 octets

accept-ranges': 'bytes'
content-range': 'bytes */15522643'

Configuration Nginx

Tout d'abord, vous devez configurer Nginx pour prendre en charge le retour des balises de plage. Il est très simple d'ajouter des octets add_header Accept-Ranges ; cette ligne peut

server {
 listen 80;
 server_name adksdf.com;
 location ~ ^/(img/|js/|css/|upload/|font/|fonts/|res/|icon) {
  add_header Access-Control-Allow-Origin *;
  add_header Accept-Ranges bytes;
  root /var/www/...;
  access_log off;
  expires max;
 }
 ...
}

.

Après l'activation, si node.js envoie des informations de requête contenant un en-tête de plage, nginx renverra des informations relatives à la plage :

Il s'agit d'un en-tête de réponse complet. Notez que content-length ici n'est pas un en-tête de réponse. file La longueur totale, mais la longueur de la plage actuelle.

{ server: 'nginx',
 date: 'Wed, 24 Jan 2018 02:43:20 GMT',
 'content-type': 'application/zip',
 'content-length': '12420187',
 'last-modified': 'Tue, 16 Jan 2018 12:09:47 GMT',
 connection: 'close',
 etag: '"5a5deb8b-ecdb53"',
 expires: 'Thu, 31 Dec 2037 23:55:55 GMT',
 'cache-control': 'max-age=315360000',
 'access-control-allow-origin': '*',
 'accept-ranges': 'bytes',
 'content-range': 'bytes 3102456-15522642/15522643' }

La taille totale du fichier peut être obtenue en fonction de la plage de contenu dans cet en-tête.

Implémentation de Node.JS

Cet exemple détecte d'abord les fichiers à moitié téléchargés localement, puis crée le fichier en lecture-écriture 'r+' mode stream et écrivez le flux de réponse dans un fichier.

Ajoutez ici la prise en charge de la plage au fichier de déclaration.

var reqOptions = { url: packageUrl, headers: {} }
var filepath  = '/path/to/your/part/file'
var fileOptions = {}
fs.stat(filepath, function(err, states) {
 if (states) {
  //Range: bytes=3744-
  reqOptions.headers['range'] = 'bytes=' + states.size + '-'
  fileOptions = { start: states.size, flags: 'r+' }
 }
 //创建 http 对象方法
 var reqUrl = reqOptions.url
 var urlObj = url.parse(reqUrl)
 var options = {
   hostname : urlObj.hostname
  , port   : urlObj.port
  , path   : urlObj.pathname
  , headers  : reqOptions.headers || {}
 }
 var req = http.request(options, function(res) {
  var receives  = []
  var err     = null
  var statusCode = res.statusCode
  var headers   = res.headers
  var ws = fs.createWriteStream(filepath, fileOptions)
  ws.on('error', function(e) {
   console.log('ws error', e)
  })
  res.on('data', function(chrunk) {
   ws.write(chrunk)
  })
  res.on('error', function(err) {
   ws.end()
  })
  res.on('end', function() {
   ws.end()
  })
 })
 req.on('error', function(e) {
  cb && cb(e, null, {})
 })
 req.end()
 ...
})

En-tête de retour

nginx peut renvoyer d'autres codes d'état lors de la demande, tel que 206 ou 416, la signification est la suivante :

206 Contenu partiel

Renvoie le contenu partiel du fichier

416 Plage demandée non satisfaisante

Plage demandée dépasse la taille du fichier

Ce qui précède est ce que j'ai compilé pour tout le monde. J'espère que cela sera utile à tout le monde à l'avenir.

Articles connexes :

Construction de fichiers multi-entrées vue Exemple d'explication de la construction multi-pages vue

Une méthode angulaire Annotations de cache de niveau (décorateurs)

Résoudre le problème des données de la page de changement d'itinéraire Vue qui ne sont pas actualisées

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn