30/09/2018, 22:14

Cho phép người dùng tải file từ remote server thông qua server của mình

Hiện tại mình muốn tạo 1 app nodejs nhỏ để kết nôi với external API. Người dùng có thể nhập tìm kiếm vào trang của mình và ra kết quả ngay mà không cần phải truy cập nhiều trang cùng lúc

Sau khi có được thông tin cần thiết rồi thì người dùng sẽ bấm tải file về. Tuy nhiên các API trên là private nên mình muốn kiểu server mình sẽ tải file về, cùng lúc đó gửi file cho người dùng luôn. Không biết cách thực hiện (hay ít nhất là thuật ngữ để tìm kiếm cái này) như thế nào.

À. Sau khi stream file cho người dùng thì server sẽ lưu trữ file đó luôn để dành sử dụng lần sau.

P/s: Sau một hồi ngẫm nghĩ thấy nó khá giống như mấy trang leech file

Người bí ẩn viết 00:18 ngày 01/10/2018

Anh lên Stack OverFlow hỏi chứ diễn đàn này anh Pro ai giúp được anh
Cứ hóng Pro thôi

Khoa Nguyen viết 00:29 ngày 01/10/2018

Project còn lâu mới triển khai. Nên cứ hỏi trên đây cho đông vui. Chứ lên SO hỏi thì mất vui.

Đỗ Nhiên viết 00:20 ngày 01/10/2018

em giới thiệu cho anh facebook của ông này chiều nay em vừa nghe ông này chém gió về node.js anh hỏi thử nha anh ông này giỏi lắm à

Đỗ Nhiên viết 00:14 ngày 01/10/2018

https://www.facebook.com/laiphuong đây anh ơi anh thử kết bạn xem cả chiều hôm nay ông này chém gió về node.js anh à @thangngoc89

Khoa Nguyen viết 00:25 ngày 01/10/2018

em giới thiệu cho anh facebook của ông này chiều nay em vừa nghe ông này chém gió về node.js anh hỏi thử nha anh ông này giỏi lắm à

https://www.facebook.com/laiphuong đây anh ơi anh thử kết bạn xem cả chiều hôm nay ông này chém gió về node.js anh à @thangngoc89

Cảm ơn bạn. Nhưng mà rắc rối thế này mình lên SO hỏi

Nguyen Ca viết 00:28 ngày 01/10/2018

Có thắc mắc là tại sao là private API mà sao Bác lại dùng nodejs get từ API được?

Khoa Nguyen viết 00:17 ngày 01/10/2018

private API mà sao Bác lại dùng nodejs get từ API được?

Tức là mình có access tới cái API đó. Nhưng mà không thể public ra ngoài được.

Nguyen Ca viết 00:28 ngày 01/10/2018

nghĩa là chỉ có bác là có quyền access đến các API đó , giờ muốn tạo mấy cái api trên node.js(trung gian) để public ra ngoài ah

Robin Huy viết 00:28 ngày 01/10/2018

Sau khi download file về thì bạn lưu vào 1 thư mục (ví dụ là public), sau đó serving static toàn bộ thư mục public, rồi trên link download thì trỏ link đến file là được.
Ví dụ serve bằng Express https://expressjs.com/en/starter/static-files.html
hoặc serve bằng Nginx https://www.nginx.com/resources/admin-guide/serving-static-content/
Ưu tiên dùng Nginx, vừa có thể lọc file lại có cơ chế cache file rất tốt.

Khoa Nguyen viết 00:22 ngày 01/10/2018

Không phải vậy. Mình muốn stream trực tiếp về cho user chứ không phải server mình down về rồi mới cho người dùng tải tiếp. Vì dung lượng file rất lớn. Server có thể xoá các file này bất cứ lúc nào tuỳ thích

Robin Huy viết 00:19 ngày 01/10/2018

Sorry mình chưa đọc kỹ yêu cầu. Tuy nhiên mình chưa hình dung ra API gốc họ sẽ trả về dữ liệu như nào, bạn có thể post mẫu lên cho mọi người cùng tham khảo không?
Theo mình nghĩ thì khi lấy dữ liệu từ API về mình tạo 1 read stream rồi trả về luôn cho người dùng sử dụng fs của nodejs https://nodejs.org/api/fs.html#fs_class_fs_readstream

Khoa Nguyen viết 00:27 ngày 01/10/2018

@robinhuy @nguyenhuuca cái API gốc không quan trọng. Vì kết quả là mình có 1 link download, chỉ dành riêng cho IP của server. Bây giờ mình muốn server của mình đóng vai trò trung gian (y như mấy cái trang leech )

tạo 1 read stream rồi trả về luôn cho người dùng sử dụng fs của nodejs

Nếu mình hiểu đúng thì mình phải download hoàn toàn file này về phải không?

Như vậy có 2 vấn đề:

  1. Chậm. Người dùng phải chờ server của mình download về hết
  2. Nhiều file có dung lượng lớn hơn dung lượng của VPS nên cách này không khả thi.

Đây có vẻ là câu trả lời. http://stackoverflow.com/questions/18879388/node-js-how-to-stream-remote-file-through-my-server-to-the-user

Cần phải test thử

Khoa Nguyen viết 00:19 ngày 01/10/2018

1 read stream rồi trả về luôn cho người dùng sử dụng fs của nodejs

Thay vì tạo read stream từ fs thì bây giờ tạo read stream từ http.get

const http = require("http")

http.createServer()
.on('request', function(req, res) {
	http.get("some-url", function(resp) {
		resp.pipe(res)
	})
})
.listen(8080)
Bài liên quan
0