मैं तीसरे पक्ष के पुस्तकालयों का उपयोग किए बिना Node.js के साथ एक फ़ाइल कैसे डाउनलोड करूं ?
मुझे कुछ विशेष की आवश्यकता नहीं है। मैं केवल किसी दिए गए URL से एक फ़ाइल डाउनलोड करना चाहता हूं, और फिर इसे किसी दिए गए निर्देशिका में सहेजें।
मैं तीसरे पक्ष के पुस्तकालयों का उपयोग किए बिना Node.js के साथ एक फ़ाइल कैसे डाउनलोड करूं ?
मुझे कुछ विशेष की आवश्यकता नहीं है। मैं केवल किसी दिए गए URL से एक फ़ाइल डाउनलोड करना चाहता हूं, और फिर इसे किसी दिए गए निर्देशिका में सहेजें।
जवाबों:
आप एक HTTP GET
अनुरोध बना सकते हैं और उसे पाइप कर सकते हैंresponse
इसे एक योग्य फ़ाइल स्ट्रीम में :
const http = require('http');
const fs = require('fs');
const file = fs.createWriteStream("file.jpg");
const request = http.get("http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg", function(response) {
response.pipe(file);
});
यदि आप कमांड लाइन पर जानकारी इकट्ठा करने का समर्थन करना चाहते हैं - जैसे लक्ष्य फ़ाइल या निर्देशिका या URL निर्दिष्ट करना - कमांडर जैसी किसी चीज़ की जाँच करें ।
node.js:201 throw e; // process.nextTick error, or 'error' event on first tick ^ Error: connect ECONNREFUSED at errnoException (net.js:646:11) at Object.afterConnect [as oncomplete] (net.js:637:18)
।
http.get
लाइन पर एक अलग URL का उपयोग करने का प्रयास करें ; हो सकता है http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg
(और के file.png
साथ बदलें file.jpg
)।
https
कर रहे हैं कि आपको https
इसका उपयोग करना चाहिए अन्यथा यह त्रुटि फेंक देगा।
त्रुटियों को संभालने के लिए मत भूलना! निम्नलिखित कोड ऑगस्टो रोमन के उत्तर पर आधारित है।
var http = require('http');
var fs = require('fs');
var download = function(url, dest, cb) {
var file = fs.createWriteStream(dest);
var request = http.get(url, function(response) {
response.pipe(file);
file.on('finish', function() {
file.close(cb); // close() is async, call cb after close completes.
});
}).on('error', function(err) { // Handle errors
fs.unlink(dest); // Delete the file async. (But we don't check the result)
if (cb) cb(err.message);
});
};
download()
ही pipe
सक्षम है?
जैसा कि मिशेल टाइली ने कहा, लेकिन उचित नियंत्रण प्रवाह के साथ:
var http = require('http');
var fs = require('fs');
var download = function(url, dest, cb) {
var file = fs.createWriteStream(dest);
http.get(url, function(response) {
response.pipe(file);
file.on('finish', function() {
file.close(cb);
});
});
}
बिना इंतजार किए finish
घटना की , भोली स्क्रिप्ट एक अधूरी फ़ाइल के साथ समाप्त हो सकती है।
संपादित करें: @Augusto रोमन को इंगित करने के लिए धन्यवाद कि cb
इसे पास किया जाना चाहिए file.close
, स्पष्ट रूप से नहीं कहा जाता है।
download()
, तो मैं यह कैसे करूंगा? मैं cb
तर्क के रूप में क्या जगह दूंगा? मेरे पास है, download('someURI', '/some/destination', cb)
लेकिन यह समझ में नहीं आता कि cb में क्या रखा जाए
त्रुटियों से निपटने की बात करें, तो त्रुटियों का अनुरोध करना भी बेहतर है। मैं भी प्रतिक्रिया कोड की जाँच करके मान्य होगा। यहां इसे केवल 200 प्रतिक्रिया कोड के लिए सफलता माना जाता है, लेकिन अन्य कोड अच्छे हो सकते हैं।
const fs = require('fs');
const http = require('http');
const download = (url, dest, cb) => {
const file = fs.createWriteStream(dest);
const request = http.get(url, (response) => {
// check if response is success
if (response.statusCode !== 200) {
return cb('Response status was ' + response.statusCode);
}
response.pipe(file);
});
// close() is async, call cb after close completes
file.on('finish', () => file.close(cb));
// check for request error too
request.on('error', (err) => {
fs.unlink(dest);
return cb(err.message);
});
file.on('error', (err) => { // Handle errors
fs.unlink(dest); // Delete the file async. (But we don't check the result)
return cb(err.message);
});
};
इस कोड की सापेक्ष सादगी के बावजूद, मैं अनुरोध मॉड्यूल का उपयोग करने की सलाह दूंगा क्योंकि यह कई अधिक प्रोटोकॉल (हैलो HTTPS!) को मूल रूप से समर्थित नहीं है।http
।
ऐसा ही किया जाएगा:
const fs = require('fs');
const request = require('request');
const download = (url, dest, cb) => {
const file = fs.createWriteStream(dest);
const sendReq = request.get(url);
// verify response code
sendReq.on('response', (response) => {
if (response.statusCode !== 200) {
return cb('Response status was ' + response.statusCode);
}
sendReq.pipe(file);
});
// close() is async, call cb after close completes
file.on('finish', () => file.close(cb));
// check for request errors
sendReq.on('error', (err) => {
fs.unlink(dest);
return cb(err.message);
});
file.on('error', (err) => { // Handle errors
fs.unlink(dest); // Delete the file async. (But we don't check the result)
return cb(err.message);
});
};
response.statusCode !== 200
पर cb finish
कभी नहीं बुलाया जाएगा।
gfxmonk के उत्तर में कॉलबैक और a के बीच बहुत कड़ी डेटा दौड़ है file.close()
पूर्णता के । file.close()
वास्तव में एक कॉलबैक लेता है जिसे करीबी पूरा होने पर बुलाया जाता है। अन्यथा, फ़ाइल का तत्काल उपयोग विफल हो सकता है (बहुत कम ही!)।
एक पूर्ण समाधान है:
var http = require('http');
var fs = require('fs');
var download = function(url, dest, cb) {
var file = fs.createWriteStream(dest);
var request = http.get(url, function(response) {
response.pipe(file);
file.on('finish', function() {
file.close(cb); // close() is async, call cb after close completes.
});
});
}
फिनिश इवेंट की प्रतीक्षा किए बिना, भोली स्क्रिप्ट एक अधूरी फ़ाइल के साथ समाप्त हो सकती है। cb
कॉलबैक को पास से शेड्यूल किए बिना , आपको फ़ाइल तक पहुँचने और वास्तव में तैयार होने वाली फ़ाइल के बीच एक दौड़ मिल सकती है।
var request =
हटा दिया जाए तो एक वैश्विक चर बनाया जाता है?
शायद नोड.जेएस बदल गया है, लेकिन ऐसा लगता है कि अन्य समाधानों के साथ कुछ समस्याएं हैं (नोड v8.1.2 का उपयोग करके):
file.close()
में कॉल करने की आवश्यकता नहीं है finish
। डिफ़ॉल्ट रूप fs.createWriteStream
से AutoClose पर सेट किया गया है: https://nodejs.org/api/fs.html#fs_fs_createwritestream_path_optionsfile.close()
त्रुटि पर बुलाया जाना चाहिए। हो सकता है कि फ़ाइल डिलीट होने ( unlink()
) के समय इसकी आवश्यकता न हो , लेकिन आम तौर पर यह है: https://nodejs.org/api/stream.html#stream_readable_pipe_destination_optionsstatusCode !== 200
fs.unlink()
कॉलबैक के बिना पदावनत किया जाता है (आउटपुट चेतावनी)dest
फ़ाइल मौजूद है; यह ओवरराइड हैनीचे एक संशोधित समाधान है (ES6 और वादों का उपयोग करके) जो इन समस्याओं को संभालता है।
const http = require("http");
const fs = require("fs");
function download(url, dest) {
return new Promise((resolve, reject) => {
const file = fs.createWriteStream(dest, { flags: "wx" });
const request = http.get(url, response => {
if (response.statusCode === 200) {
response.pipe(file);
} else {
file.close();
fs.unlink(dest, () => {}); // Delete temp file
reject(`Server responded with ${response.statusCode}: ${response.statusMessage}`);
}
});
request.on("error", err => {
file.close();
fs.unlink(dest, () => {}); // Delete temp file
reject(err.message);
});
file.on("finish", () => {
resolve();
});
file.on("error", err => {
file.close();
if (err.code === "EEXIST") {
reject("File already exists");
} else {
fs.unlink(dest, () => {}); // Delete temp file
reject(err.message);
}
});
});
}
const https = require("https");
के लिएconst http = require("http");
निम्नलिखित कोड ब्रैंडन टायली के उत्तर पर आधारित है:
var http = require('http'),
fs = require('fs');
var request = http.get("http://example12345.com/yourfile.html", function(response) {
if (response.statusCode === 200) {
var file = fs.createWriteStream("copy.html");
response.pipe(file);
}
// Add timeout.
request.setTimeout(12000, function () {
request.abort();
});
});
जब आपको कोई त्रुटि मिलती है, तो फ़ाइल न करें, और एक्स सेकंड के बाद अपने अनुरोध को बंद करने के लिए टाइमआउट का उपयोग करने का पूर्वाभास करें।
http.get("http://example.com/yourfile.html",function(){})
http.get
। मेमोरी लीक केवल तभी होती है जब फ़ाइल को डाउनलोड होने में बहुत लंबा समय लगता है।
उन लोगों के लिए जो एस 6-शैली वादे के आधार पर खोज करते हैं, मुझे लगता है कि यह कुछ इस तरह होगा:
var http = require('http');
var fs = require('fs');
function pDownload(url, dest){
var file = fs.createWriteStream(dest);
return new Promise((resolve, reject) => {
var responseSent = false; // flag to make sure that response is sent only once.
http.get(url, response => {
response.pipe(file);
file.on('finish', () =>{
file.close(() => {
if(responseSent) return;
responseSent = true;
resolve();
});
});
}).on('error', err => {
if(responseSent) return;
responseSent = true;
reject(err);
});
});
}
//example
pDownload(url, fileLocation)
.then( ()=> console.log('downloaded file no issues...'))
.catch( e => console.error('error while downloading', e));
responseSet
ध्वज का कारण, किसी कारण से, जिसकी जांच के लिए मेरे पास समय नहीं था, मेरी फ़ाइल अपूर्ण रूप से डाउनलोड की जानी थी। कोई त्रुटि नहीं हुई, लेकिन .txt फ़ाइल मैं पॉप्युलेट कर रहा था जिसमें पंक्तियों का आधा हिस्सा था जो वहां होना चाहिए। झंडे के लिए तर्क को हटाकर इसे ठीक कर दिया। बस यह इंगित करना चाहता था कि अगर किसी के पास दृष्टिकोण के साथ मुद्दे थे। फिर भी, +1
विंस युआन का कोड बहुत अच्छा है लेकिन यह कुछ गलत लगता है।
function download(url, dest, callback) {
var file = fs.createWriteStream(dest);
var request = http.get(url, function (response) {
response.pipe(file);
file.on('finish', function () {
file.close(callback); // close() is async, call callback after close completes.
});
file.on('error', function (err) {
fs.unlink(dest); // Delete the file async. (But we don't check the result)
if (callback)
callback(err.message);
});
});
}
मैं अनुरोध () पसंद करता हूं क्योंकि आप इसके साथ http और https दोनों का उपयोग कर सकते हैं।
request('http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg')
.pipe(fs.createWriteStream('cat.jpg'))
"As of Feb 11th 2020, request is fully deprecated. No new changes are expected to land. In fact, none have landed for some time."
const download = (url, path) => new Promise((resolve, reject) => {
http.get(url, response => {
const statusCode = response.statusCode;
if (statusCode !== 200) {
return reject('Download error!');
}
const writeStream = fs.createWriteStream(path);
response.pipe(writeStream);
writeStream.on('error', () => reject('Error writing to file!'));
writeStream.on('finish', () => writeStream.close(resolve));
});}).catch(err => console.error(err));
हाय Hi मुझे लगता है कि आप child_process मॉड्यूल और कर्ल कमांड का उपयोग कर सकते हैं ।
const cp = require('child_process');
let download = async function(uri, filename){
let command = `curl -o ${filename} '${uri}'`;
let result = cp.execSync(command);
};
async function test() {
await download('http://zhangwenning.top/20181221001417.png', './20181221001417.png')
}
test()
इसके अलावा , जब आप बड़ी , एकाधिक फ़ाइलें डाउनलोड करना चाहते हैं तो use आप अधिक सीपीयू कोर का उपयोग करने के लिए क्लस्टर मॉड्यूल का उपयोग कर सकते हैं ।
आप https://github.com/douzi8/ajax-request#download का उपयोग कर सकते हैं
request.download('http://res.m.ctrip.com/html5/Content/images/57.png',
function(err, res, body) {}
);
ajax-request
है कि थर्ड पार्टी लाइब्रेरी नहीं है?
वादा का उपयोग करके डाउनलोड करें, जो एक पठनीय धारा को हल करता है। रीडायरेक्ट को संभालने के लिए अतिरिक्त तर्क रखें।
var http = require('http');
var promise = require('bluebird');
var url = require('url');
var fs = require('fs');
var assert = require('assert');
function download(option) {
assert(option);
if (typeof option == 'string') {
option = url.parse(option);
}
return new promise(function(resolve, reject) {
var req = http.request(option, function(res) {
if (res.statusCode == 200) {
resolve(res);
} else {
if (res.statusCode === 301 && res.headers.location) {
resolve(download(res.headers.location));
} else {
reject(res.statusCode);
}
}
})
.on('error', function(e) {
reject(e);
})
.end();
});
}
download('http://localhost:8080/redirect')
.then(function(stream) {
try {
var writeStream = fs.createWriteStream('holyhigh.jpg');
stream.pipe(writeStream);
} catch(e) {
console.error(e);
}
});
यदि आप एक्सप्रेस का उपयोग कर रहे हैं res.download () विधि। अन्यथा एफएस मॉड्यूल का उपयोग करें।
app.get('/read-android', function(req, res) {
var file = "/home/sony/Documents/docs/Android.apk";
res.download(file)
});
(या)
function readApp(req,res) {
var file = req.fileName,
filePath = "/home/sony/Documents/docs/";
fs.exists(filePath, function(exists){
if (exists) {
res.writeHead(200, {
"Content-Type": "application/octet-stream",
"Content-Disposition" : "attachment; filename=" + file});
fs.createReadStream(filePath + file).pipe(res);
} else {
res.writeHead(400, {"Content-Type": "text/plain"});
res.end("ERROR File does NOT Exists.ipa");
}
});
}
All यदि आप पाइपलाइन का उपयोग करते हैं , तो यह अन्य सभी धाराओं को बंद कर देगा और सुनिश्चित करेगा कि मेमोरी लीक न हों।
कार्य उदाहरण:
const http = require('http'); const { pipeline } = require('stream'); const fs = require('fs'); const file = fs.createWriteStream('./file.jpg'); http.get('http://via.placeholder.com/150/92c952', response => { pipeline( response, file, err => { if (err) console.error('Pipeline failed.', err); else console.log('Pipeline succeeded.'); } ); });
से मेरा उत्तर करने के लिए "क्या .pipe और नदियों पर .pipeline के बीच का अंतर है" ।
पथ: img प्रकार: jpg यादृच्छिक uniqid
function resim(url) {
var http = require("http");
var fs = require("fs");
var sayi = Math.floor(Math.random()*10000000000);
var uzanti = ".jpg";
var file = fs.createWriteStream("img/"+sayi+uzanti);
var request = http.get(url, function(response) {
response.pipe(file);
});
return sayi+uzanti;
}
पुस्तकालय के बिना यह केवल इंगित करने के लिए छोटी गाड़ी हो सकती है। यहाँ कुछ है:
Protocol "https:" not supported.
यहाँ मेरा सुझाव है:
wget
याcurl
var wget = require('node-wget-promise');
wget('http://nodejs.org/images/logo.svg');
function download(url, dest, cb) {
var request = http.get(url, function (response) {
const settings = {
flags: 'w',
encoding: 'utf8',
fd: null,
mode: 0o666,
autoClose: true
};
// response.pipe(fs.createWriteStream(dest, settings));
var file = fs.createWriteStream(dest, settings);
response.pipe(file);
file.on('finish', function () {
let okMsg = {
text: `File downloaded successfully`
}
cb(okMsg);
file.end();
});
}).on('error', function (err) { // Handle errors
fs.unlink(dest); // Delete the file async. (But we don't check the result)
let errorMsg = {
text: `Error in file downloadin: ${err.message}`
}
if (cb) cb(errorMsg);
});
};
var fs = require('fs'),
request = require('request');
var download = function(uri, filename, callback){
request.head(uri, function(err, res, body){
console.log('content-type:', res.headers['content-type']);
console.log('content-length:', res.headers['content-length']);
request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
});
};
download('https://www.cryptocompare.com/media/19684/doge.png', 'icons/taskks12.png', function(){
console.log('done');
});
तीसरे पक्ष की निर्भरता के बिना इसे संभालने का एक और तरीका अभी भी है और पुनर्निर्देश की खोज भी कर रहा है:
var download = function(url, dest, cb) {
var file = fs.createWriteStream(dest);
https.get(url, function(response) {
if ([301,302].indexOf(response.statusCode) !== -1) {
body = [];
download(response.headers.location, dest, cb);
}
response.pipe(file);
file.on('finish', function() {
file.close(cb); // close() is async, call cb after close completes.
});
});
}
download.js (यानी /project/utils/download.js)
const fs = require('fs');
const request = require('request');
const download = (uri, filename, callback) => {
request.head(uri, (err, res, body) => {
console.log('content-type:', res.headers['content-type']);
console.log('content-length:', res.headers['content-length']);
request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
});
};
module.exports = { download };
app.js
...
// part of imports
const { download } = require('./utils/download');
...
// add this function wherever
download('https://imageurl.com', 'imagename.jpg', () => {
console.log('done')
});
हम डाउनलोड नोड मॉड्यूल और इसके बहुत सरल का उपयोग कर सकते हैं, कृपया नीचे देखें https://www.npmjs.com/package/download
var requestModule=require("request");
requestModule(filePath).pipe(fs.createWriteStream('abc.zip'));