2012-10-28 23 views
26

Tôi muốn truyền trực tuyến nội dung tới các máy khách có thể được lưu trữ trong db mà chúng sẽ lưu dưới dạng tệp.Các tệp luồng trong nút/express tới máy khách

Rõ ràng res.download sẽ thực hiện công việc một cách độc đáo, nhưng không có phản hồi nào. * Chức năng chấp nhận luồng, chỉ đường dẫn tệp.

Tôi đã xem xét tệp res.download impl và nó chỉ đặt tiêu đề Content-Disposition và sau đó là một tệp gửi.

Vì vậy, tôi có thể đạt được điều này bằng cách sử dụng bài đăng này làm hướng dẫn. Node.js: pipe stream to response freezes over HTTPS

Nhưng có vẻ như tôi sẽ bỏ lỡ tất cả các khía cạnh gói mà res.send thực hiện.

Tôi có thiếu gì đó ở đây hay tôi chỉ nên làm đường ống và không lo lắng về nó - thực hành tốt nhất ở đây là gì?

Hiện đang tạo tệp tạm thời để tôi có thể sử dụng res.download ngay bây giờ.

+0

Thử phương pháp này http://stackoverflow.com/questions/10207762/how-to-use-request-or-http-module-to-read-gzip-page-into-a- string/10603029 # 10603029 –

Trả lời

63

Bạn có thể phát trực tiếp tới đối tượng phản hồi (đó là Luồng).

Luồng tệp cơ bản sẽ trông giống như thế này.

function(req, res, next) { 
    if(req.url==="somethingorAnother") { 
    res.setHeader("content-type", "some/type"); 
    fs.createReadStream("./toSomeFile").pipe(res); 
    } else { 
    next(); // not our concern, pass along to next middleware function 
    } 
} 

này sẽ chăm sóc ràng buộc để dataend sự kiện.

+2

@Tim bạn nên đánh dấu điều này là đã trả lời nếu nó làm việc cho bạn –

+0

Với những người upvotes nó có vẻ làm việc cho nhiều người và điều đó bao gồm tôi. Cảm ơn! – jlh

+1

Nhắc lại để gọi 'next' nếu' req.url! == "somethingorAnother" ' – Carlos

1

Đảm bảo rằng yêu cầu AJAX của bạn từ ứng dụng khách có tập hợp 'responseType' thích hợp. ví dụ như

$http({ 
    method :'GET', 
    url : http://url, 
    params:{}, 
    responseType: 'arraybuffer' 
}).success() 
Các vấn đề liên quan