2012-04-06 26 views
75

Expressjs framework bir sendfile() yöntemine sahiptir. Bütün bir çerçeve kullanmadan bunu nasıl yapabilirim. Bir arşiv oluşturmak için node-native-zip kullanıyorum ve bunu kullanıcıya göndermek istiyorum.Nodejs yanıt olarak dosya gönder

cevap

119

Burada, myfile.mp3 dosyasını diskten aktararak gönderecek bir örnek programdır (yani, dosyayı göndermeden önce tüm dosyayı belleğe okumaz). Sunucu bağlantı noktasını dinler 2000, yorumlarında @Aftershock bahsettiği util.pump gitmiş ve pipe denilen Akış prototip üzerinde bir yöntem ile değiştirildi gibi

[Güncelleme]; Aşağıdaki kod bunu yansıtı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); 

Bir yanıt dosyası (arşiv) göndermek için Stream kullanmak gerek http://elegantcode.com/2011/04/06/taking-baby-steps-with-node-js-pumping-data-between-streams/

+0

Ama ben sunucudan bir dosya akışı değil, ben arşivi oluşturmak – andrei

+0

"Akış" ile "dosya veri okunan gibi okundu olarak" yerine "bellekte tüm dosyayı okuyun" Tüm bu verileri bir kerede bağlantıya gönder "(tipik saf yaklaşım). Ben "diske gitmeden bellekten veri akışı" demek istemiyorum. Bağlantılı olduğum yazı daha ayrıntılı olarak açıklıyor. –

+0

tamam şimdi anladım, teşekkürler. Oradan başlayacağım – andrei

3

Alındığı, ne daha size cevap başlığında uygun içerik türünü kullanmak zorunda.

bir örnek işlevi vardır bunu o:

Content-Type alanının amacı alıcı kullanıcı aracı uygun bir alabilmesi tamamen yeterli vücutta bulunan verileri tanımlamaktır

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"); 
     } 
    }); 
    } 
} 
Verileri kullanıcıya sunmak veya başka şekilde uygun bir şekilde veri ile ilgilenmek için aracı veya mekanizma.

"application/octet-stream" RFC 2046 yılında "keyfi ikili veri" olarak tanımlanır, bu içerik türü amacı diske kaydedilecek olan - bu gerçekten gereken budur.

"filename = [dosya adı]" indirilecek dosyanın adını belirtir.

Daha fazla bilgi için lütfen this stackoverflow topic'a bakın.