Recursively call download if you get a Moved Permanently or Found Moved Temporarily redirect following the link location provided in the header. The issue with some of the other answers recursively calling download was that they called resolve download instead of download This way the nested chain of promises resolve in the correct order. It might seem cool to clean up the temp file asynchronously, but I chose to reject only after that completed too so I know that everything start to finish is done when this promise resolves or rejects.
Josh Peak Josh Peak 4, 4 4 gold badges 33 33 silver badges 48 48 bronze badges. You shouldn't waste resources doing the download if the destination file already exists. Do the check first if possible. Phil Really good point. I have updated the example with an earlier guard check before falling into the recursive networking calls but left the success file handling code the same. This short circuit guard statement should save some time in this case now. Vince Yuan's code is great but it seems to be something wrong.
But we don't check the result if callback callback err. Feel Physics Feel Physics 2, 4 4 gold badges 23 23 silver badges 36 36 bronze badges. I prefer request because you can use both http and https with it. Looks like Request has been deprecated github. No new changes are expected to land. In fact, none have landed for some time. Wai Ha Lee 7, 61 61 gold badges 56 56 silver badges 85 85 bronze badges. Idan Dagan Idan Dagan 7, 3 3 gold badges 28 28 silver badges 38 38 bronze badges.
Roman Podlinov Roman Podlinov Very clean, thank you. What do the flags 'wx' do when you're creating the writeStream? It is returning garbage character if file name is other than ascii like if filename is in japanese. Do you think ajax-request is not a third party library? Download using promise, which resolve a readable stream. The questions was specific to not include third party modes : — David Gatti.
If you are using express use res. A 13k 4 4 gold badges 90 90 silver badges bronze badges. Using the http2 Module I saw answers using the http , https , and request modules. I'd like to add one using yet another native NodeJS module that supports either the http or https protocol: Solution I've referenced the official NodeJS API, as well as some of the other answers on this question for something I'm doing.
Rik Rik 3 3 silver badges 8 8 bronze badges. Is this backward compatible? Works everywhere or only for http2? Neil I'm assuming you are asking if http2 is backward compatible with http1. Because http2 improves framing; adding binary compression, the ability to push from server to client, and simultaneous connections - it is absolutely required that both server and client know the implementation this allows abstraction of implementation from the application too.
Good news is that all major browsers have supported http2 since about - and Node as a client does too. Node, Nginx, and Apache offer it server side - so most use cases are covered. Its a vast improvement. Thanks for the reply Rik — Neil. Without library it could be buggy just to point out. Here my suggestion: Call system tool like wget or curl use some tool like node-wget-promise which also very simple to use. Geng Jiawen Geng Jiawen 7, 2 2 gold badges 41 41 silver badges 36 36 bronze badges. Writing my own solution since the existing didn't fit my requirements.
Alex Pilugin Alex Pilugin 2 2 gold badges 9 9 silver badges 30 30 bronze badges. Pankaj Pankaj 1 1 gold badge 3 3 silver badges 9 9 bronze badges. Frankenmint Frankenmint 1, 1 1 gold badge 17 17 silver badges 30 30 bronze badges.
Like: res. Jeremy M. Yin Yin 9. I suggest you to use res. Mehrzad Tejareh 4 4 silver badges 18 18 bronze badges. Vivek Narayan Vivek Narayan 1 1 1 bronze badge. Bugs 4, 9 9 gold badges 31 31 silver badges 40 40 bronze badges. Chandrakant Thakkar Chandrakant Thakkar 8 8 silver badges 21 21 bronze badges. Code dumps are generally not useful and may be downvoted or deleted.
It would be worth editing to at least explain what the code is doing for future visitors. Now the tricky part, where I lost plenty of time. We need to pipe the message as it is a readable stream to our writable stream.
But the fact is that we need to wait until the close event is triggered. This is where you need to wrap this up in the promise and wait for it to complete. In my example, I also look up for the error event and in case I do reject the promise. Believe it or not, considering my limited experience with JavaScript and TypeScript, I was not awaiting for those events and my code refused to work.
I lost some time figuring things out and google was of no much help. Please share your thoughts with me in case you think this can be improved, I would love to learn more about it.
Also, you are again basing functions on callbacks, not really handy with TypeScript, thus I will prefer promises. The download package allows you to download a file from a URL and save it under a folder as shown below:. The code above saves both logo. Follow me on Twitter and LinkedIn. You can also subscribe to RSS Feed. I started this blog as a place to share everything I have learned in the last decade.
0コメント