Nodej'ler yanıt olarak dosya gönderir


113

Expressjs çerçevesi bir sendfile () yöntemine sahiptir. Bütün bir çerçeve kullanmadan bunu nasıl yapabilirim? Arşiv oluşturmak için node-native-zip kullanıyorum ve bunu kullanıcıya göndermek istiyorum.

Yanıtlar:


183

İşte myfile.mp3'ü diskten akışa alarak gönderecek örnek bir program (yani, dosyayı göndermeden önce tüm dosyayı belleğe okumaz). Sunucu, 2000 numaralı bağlantı noktasını dinler.

[Güncelleme] Yorumlarda @Aftershock tarafından belirtildiği gibi util.pumpgitti ve Stream prototipinde adı verilen bir yöntemle değiştirildi pipe; aşağıdaki kod bunu yansıtmaktadır.

var http = require('http'),
    fileSystem = require('fs'),
    path = require('path');

http.createServer(function(request, response) {
    var filePath = path.join(__dirname, 'myfile.mp3');
    var stat = fileSystem.statSync(filePath);

    response.writeHead(200, {
        'Content-Type': 'audio/mpeg',
        'Content-Length': stat.size
    });

    var readStream = fileSystem.createReadStream(filePath);
    // We replaced all the event handlers with a simple call to readStream.pipe()
    readStream.pipe(response);
})
.listen(2000);

Alındığı http://elegantcode.com/2011/04/06/taking-baby-steps-with-node-js-pumping-data-between-streams/


1
Ama sunucudan bir dosya
aktarmıyorum

"Akış" derken, "tüm dosyayı bellekte okuyup ardından tüm bu verileri bir kerede bağlantıya gönder" yerine "dosya verilerini okunurken bağlantıya gönder" demek istiyorum (tipik saf yaklaşım budur). Ben yok "o diske gitmeden bellekten veri akışı." Demek Bağlantı verdiğim gönderi daha ayrıntılı olarak açıklıyor.
Michelle Tilley

6
util.pump (okuma akışı, yanıt); amortismana tabi ... readStream.pipe (yanıt) kullanın;
Artçı Şok


@Abdul Sorunuzu anladığımdan emin değilim; bana bir e-posta atmak ister misin ?
Michelle Tilley

13

Bir yanıtta dosya (arşiv) göndermek için Akış kullanmanız gerekir, yanıt başlığınızda uygun İçerik türünü kullanmanız da gerekir.

Bunu yapan örnek bir fonksiyon var:

const fs = require('fs');

// Where fileName is name of the file and response is Node.js Reponse. 
responseFile = (fileName, response) => {
  const filePath =  "/path/to/archive.rar" // or any file format

  // Check if file specified by the filePath exists 
  fs.exists(filePath, function(exists){
      if (exists) {     
        // Content-type is very interesting part that guarantee that
        // Web browser will handle response in an appropriate manner.
        response.writeHead(200, {
          "Content-Type": "application/octet-stream",
          "Content-Disposition": "attachment; filename=" + fileName
        });
        fs.createReadStream(filePath).pipe(response);
      } else {
        response.writeHead(400, {"Content-Type": "text/plain"});
        response.end("ERROR File does not exist");
      }
    });
  }
}

İçerik Türü alanının amacı, alıcı kullanıcı aracısının verileri kullanıcıya sunmak için uygun bir aracı veya mekanizmayı seçebilmesi veya başka bir şekilde verileri uygun bir şekilde ele alabilmesi için vücutta bulunan verileri yeterince tam olarak açıklamaktır.

"uygulama / sekizli akışı", RFC 2046'da "rastgele ikili veri" olarak tanımlanır, bu içerik türünün amacı diske kaydedilmektir - gerçekten ihtiyacınız olan şey budur.

"dosyaadı = [dosyanın adı]" indirilecek dosyanın adını belirtir.

Daha fazla bilgi için lütfen bu yığın akışı konusuna bakın .


istemci tarafındaki çağrı isteği nasıl istemci tarafı kodu verir
ashwini

1
lütfen 'var' işlevinin kullanımdan kaldırıldığını unutmayın.
Ievgen Naida
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.