Nodejs mengirim file sebagai tanggapan

113

Framework Expressjs memiliki metode sendfile (). Bagaimana saya bisa melakukannya tanpa menggunakan seluruh kerangka kerja. Saya menggunakan node-native-zip untuk membuat arsip dan saya ingin mengirimkannya ke pengguna.

andrei
sumber

Jawaban:

183

Berikut adalah contoh program yang akan mengirim myfile.mp3 dengan mengalirkannya dari disk (yaitu, tidak membaca seluruh file ke dalam memori sebelum mengirim file). Server mendengarkan pada port 2000.

[Pembaruan] Seperti yang disebutkan oleh @Aftershock di komentar, util.pumphilang dan diganti dengan metode pada prototipe Stream yang disebut pipe; kode di bawah ini mencerminkan hal ini.

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);

Diambil dari http://elegantcode.com/2011/04/06/taking-baby-steps-with-node-js-pumping-data-between-streams/

Michelle Tilley
sumber
1
Tapi saya tidak streaming file dari server, saya membuat arsip
andrei
Yang saya maksud dengan "aliran" adalah "mengirim data file ke koneksi saat sedang dibaca" sebagai lawan dari "membaca seluruh file dalam memori kemudian mengirim semua data itu ke koneksi sekaligus" (yang merupakan pendekatan naif yang khas). Saya tidak bermaksud "mengalirkan data dari memori tanpa ke disk." Pos yang saya tautkan menjelaskan lebih detail.
Michelle Tilley
6
util.pump (readStream, response); disusutkan ... gunakan readStream.pipe (response);
Gempa susulan
@Abdul Tidak yakin saya mengerti pertanyaan Anda; ingin mengirimiku email ?
Michelle Tilley
13

Anda perlu menggunakan Stream untuk mengirim file (arsip) sebagai tanggapan, terlebih lagi Anda harus menggunakan Jenis konten yang sesuai di header tanggapan Anda.

Ada contoh fungsi yang melakukannya:

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");
      }
    });
  }
}

Tujuan bidang Jenis Konten adalah untuk mendeskripsikan data yang terdapat dalam isi dengan cukup lengkap sehingga agen pengguna penerima dapat memilih agen atau mekanisme yang sesuai untuk menyajikan data kepada pengguna, atau menangani data dengan cara yang tepat.

"application / octet-stream" didefinisikan sebagai "data biner sewenang-wenang" di RFC 2046, tujuan jenis konten ini adalah untuk disimpan ke disk - itulah yang Anda butuhkan.

"filename = [name of file]" menentukan nama file yang akan diunduh.

Untuk informasi lebih lanjut, silakan lihat topik stackoverflow ini .

MikePtr
sumber
bagaimana permintaan panggilan di sisi klien memberikan kode sisi klien
ashwini
1
harap dicatat bahwa fungsi 'ada' tidak digunakan lagi.
Ievgen Naida