Trả về một file nén từ hàm nodejs

Tarun

New Member
#1
Mình có một nodejs microservice, ở đó có một file zip chứa 3 tập tin đã được tạo ra bởi code.
Bây giờ, mình cần gửi file zip này response khi dịch vụ của mình nhận được curl request. Mình đọc qua các câu hỏi tương tự nhưng họ đề xuất cách tải xuống ở phía máy khách, không chắc chắn cách sử dụng chúng ở đây.

Code nodejs của mình là:
Mã:
var zipper = require('zip-local');
app.post("/checkFunc", function(req, res) {
    zipper.sync.zip("./finalFiles").compress().save("pack.zip");
    // so now the zip is created and stored at pack.zip
    console.log("Hello);
    res.writeHead(200, { 'Content-Type': 'application/octet-stream' });   

    //res.send(a); //not sure how to send the zip file, if I know the path of the zip file.
});
 

Admin

Administrator
Thành viên BQT
#2
Nếu bạn biết đường dẫn của zip thì bạn có thể tạo một stream có thể đọc được bằng cách sử dụng fs.createReadStream() và sử dụng pipe() để truyền dữ liệu từ stream trực tiếp tới response.
Mã:
const express = require('express')
const fs = require('fs')
const port = process.env.PORT || 1337
const zipper = require('zip-local')

const app = express()

app.post('/checkFunc', (req, res) => {
    // If you're going to use synchronous code then you have to wrap it
    // in a try/catch if you don't want to crash your server. In this case
    // I'm just handling the error and returning back a 500 error with a
    // standard response message of Internal Server Error. You could do more
    //
    // Using the Error Handling Middleware (err, req, res, next) => {}
    // you can create a more robust error handling setup.
    // You can read more about that in the ExpressJS documentation.
    try {
      zipper.sync.zip("./finalFiles").compress().save("pack.zip");
    } catch (err) {
      console.error('An error occurred zipping', err)
      return res.sendStatus(500)
    }

    // Create a readable stream that we can pipe to the response object
    let readStream = fs.createReadStream('./finalFiles/pack.zip')

    // When everything has been read from the stream, end the response
    readStream.on('close', () => res.end())

    // Pipe the contents of the readStream directly to the response
    readStream.pipe(res)
});

app.listen(port, () => console.log(`Listening on ${port}`))
 
OP
OP
T

Tarun

New Member
#3
Cảm ơn ad đã phản hồi nhanh và nhận xét về code đồng bộ. chắc chắn có giá trị. Mình đã không nhận ra là mình có thể gửi nó như một tập tin bình thường thông qua readStream
 

Từ khóa phổ biến

You are using an out of date browser. It may not display this or other websites correctly.
You should upgrade or use an alternative browser.

Top