khung Expressjs có phương thức sendfile(). Làm thế nào tôi có thể làm điều đó mà không cần sử dụng toàn bộ khung công tác. Tôi đang sử dụng node-native-zip để tạo một kho lưu trữ và tôi muốn gửi nó cho người dùng.Nodejs gửi tệp theo phản hồi
Trả lời
Đây là một chương trình ví dụ sẽ gửi myfile.mp3 bằng cách phát trực tuyến từ đĩa (nghĩa là nó không đọc toàn bộ tệp vào bộ nhớ trước khi gửi tệp). Các máy chủ lắng nghe trên cổng 2000.
[Cập nhật] Như đã đề cập bởi @Aftershock trong các ý kiến, util.pump
đã biến mất và được thay thế bằng một phương pháp trên nguyên mẫu Suối gọi pipe
; mã dưới đây phản ánh điều này.
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);
Taken từ http://elegantcode.com/2011/04/06/taking-baby-steps-with-node-js-pumping-data-between-streams/
Bạn cần sử dụng Suối gửi file (lưu trữ) trong một phản ứng, những gì là nhiều hơn bạn phải sử dụng thích hợp Content-type trong phần đầu trả lời của bạn.
Có một chức năng ví dụ mà làm điều đó:
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");
}
});
}
}
Mục đích của trường Content-Type là để mô tả dữ liệu chứa trong cơ thể hoàn toàn đủ để user agent nhận có thể chọn một thích hợp tác nhân hoặc cơ chế để trình bày dữ liệu cho người dùng hoặc xử lý dữ liệu theo cách thích hợp.
"ứng dụng/octet-stream" được định nghĩa là "dữ liệu nhị phân tùy ý" trong RFC 2046, mục đích của loại nội dung này sẽ được lưu vào đĩa - đó là những gì bạn thực sự cần.
"filename = [name of file]" chỉ định tên tệp sẽ được tải xuống.
Để biết thêm thông tin, vui lòng xem this stackoverflow topic.
- 1. Phản hồi luồng trực tuyến với NodeJS
- 2. Cách đặt tên tệp theo phản hồi
- 3. Gửi phản hồi JSON bằng Scrapy
- 4. Codeigniter PHP JSON gửi phản hồi HTML
- 5. Loại bỏ các phản hồi 401 "Không được phép" theo sau là 200 phản hồi "Ok"
- 6. Đặt cookie theo phản hồi nguy hiểm
- 7. Python Gửi biểu mẫu và nhận phản hồi
- 8. Phản hồi Zip JSON trong node.js
- 9. chuyển hướng phản hồi từ tệp .ashx
- 10. HttpWebRequest/HttpResponse: Cách gửi dữ liệu trong phản hồi?
- 11. Gửi phản hồi Json dưới dạng Chuỗi và Số nguyên ...
- 12. Cần gửi gói UDP và nhận phản hồi trong Java
- 13. Cách gửi yêu cầu HTTP POST và nhận phản hồi?
- 14. Gửi yêu cầu POST mà không cần chờ phản hồi?
- 15. Gửi biểu mẫu và nhận phản hồi JSON với jQuery
- 16. JavaScript: Gửi POST, chuyển hướng đến phản hồi
- 17. Node Express gửi tệp hình ảnh dưới dạng phản hồi API
- 18. Tại sao tôi không thể viết các ký tự Trung Quốc trong phản hồi HTTP nodejs?
- 19. Thay đổi kích thước NodeJS gm và đường ống để phản hồi
- 20. Elisp - json-read-from-string theo phản hồi từ API
- 21. Hiển thị phản hồi theo định dạng được mong đợi
- 22. Phản hồi gần Express.js
- 23. nodejs, socket.io: cách nhận yêu cầu và phản hồi từ chức năng socket?
- 24. Cách đọc luồng phản hồi trước khi phản hồi Http hoàn thành
- 25. CLLocationQuản lý phản hồi
- 26. jQuery Ajax: phản hồi pdf
- 27. Spring MVC, buộc phản hồi JSON theo yêu cầu đơn giản
- 28. Phản hồi Ajax bên trong div
- 29. sử dụng phản hồi http cách lưu các tệp pdf
- 30. AJAX/Jquery - Nhận phản hồi từ tệp php
Nhưng tôi không phát trực tuyến tệp từ máy chủ, tôi tạo lưu trữ – andrei
Bằng "luồng", tôi có nghĩa là "gửi dữ liệu tệp tới kết nối khi được đọc" thay vì "đọc toàn bộ tệp trong bộ nhớ gửi tất cả dữ liệu đó đến kết nối cùng một lúc "(đó là cách tiếp cận ngây thơ điển hình). Tôi _don't_ có nghĩa là "truyền dữ liệu từ bộ nhớ mà không cần đĩa." Bài đăng tôi đã liên kết để giải thích chi tiết hơn. –
ok bây giờ tôi nhận được nó, cảm ơn. tôi sẽ bắt đầu từ đó – andrei