আমি তৃতীয় পক্ষের লাইব্রেরি ব্যবহার না করে নোড.জেএস দিয়ে একটি ফাইল কীভাবে ডাউনলোড করব ?
আমার বিশেষ কিছু লাগবে না। আমি কেবল একটি প্রদত্ত ইউআরএল থেকে একটি ফাইল ডাউনলোড করতে চাই এবং তারপরে একটি প্রদত্ত ডিরেক্টরিতে এটি সংরক্ষণ করতে চাই।
আমি তৃতীয় পক্ষের লাইব্রেরি ব্যবহার না করে নোড.জেএস দিয়ে একটি ফাইল কীভাবে ডাউনলোড করব ?
আমার বিশেষ কিছু লাগবে না। আমি কেবল একটি প্রদত্ত ইউআরএল থেকে একটি ফাইল ডাউনলোড করতে চাই এবং তারপরে একটি প্রদত্ত ডিরেক্টরিতে এটি সংরক্ষণ করতে চাই।
উত্তর:
আপনি এইচটিটিপি 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
ইভেন্টটির জন্য অপেক্ষা না করে , নিষ্পাপ স্ক্রিপ্টগুলি অসম্পূর্ণ ফাইলের সাথে শেষ হতে পারে।
সম্পাদনা করুন: অগাস্টো রোমানকে ধন্যবাদ জানাতে যে cb
এটি পাস করা উচিত file.close
, স্পষ্টভাবে বলা হয় না।
download()
কীভাবে এটি করব? আমি cb
যুক্তি হিসাবে কি রাখব ? আমার কাছে download('someURI', '/some/destination', 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);
});
};
এই কোডটির আপেক্ষিক সরলতা থাকা সত্ত্বেও, আমি অনুরোধ মডিউলটি ব্যবহার করার পরামর্শ দেব কারণ এটি অনেকগুলি প্রোটোকল (হ্যালো এইচটিটিপিএস!) পরিচালনা করে যা স্থানীয়ভাবে সমর্থন করে না 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
সিবি অন finish
কখনও কল করা হবে না।
জিএফএক্সমোনকের উত্তরটির কলব্যাক এবং 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 =
হয়?
সম্ভবত নোড.জেএস পরিবর্তিত হয়েছে, তবে মনে হচ্ছে অন্যান্য সমাধানগুলিতে কিছু সমস্যা রয়েছে (নোড ভি 8.1.2 ব্যবহার করে):
file.close()
যে finish
ইভেন্ট। ডিফল্টরূপে fs.createWriteStream
অটোক্লোজে সেট করা আছে: 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
। ফাইলটি ডাউনলোড হতে খুব বেশি সময় নিলে কেবল মেমরি ফাঁস হয়।
যারা এস-স্টাইলের প্রতিশ্রুতি ভিত্তিক উপায়ে সন্ধানে এসেছেন, আমি অনুমান করি এটি এমন কিছু হবে:
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));
হাই , আমি মনে করি আপনি চাইল্ড_প্রসেস মডিউল এবং কার্ল কমান্ড ব্যবহার করতে পারেন ।
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()
এছাড়াও - আপনি যখন বড় 、 একাধিক ফাইল ডাউনলোড করতে চান - আপনি আরও সিপিইউ কোর ব্যবহার করতে ক্লাস্টার মডিউলটি ব্যবহার করতে পারেন ।
আপনি 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);
}
});
আপনি যদি এক্সপ্রেস ব্যবহার করুন পুনঃডাউনলোড () পদ্ধতিটি ব্যবহার করেন। অন্যথায় fs মডিউল ব্যবহার।
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");
}
});
}
O সুতরাং আপনি যদি পাইপলাইন ব্যবহার করেন তবে এটি অন্যান্য সমস্ত স্ট্রিম বন্ধ করে দেবে এবং মেমরির কোনও ফাঁস নেই তা নিশ্চিত করবে।
কাজের উদাহরণ:
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 এলোমেলো একীকিড un
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.
});
});
}
ডাউনলোড. 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'));