নোড.জেএস (তৃতীয় পক্ষের লাইব্রেরি ব্যবহার না করে) দিয়ে একটি ফাইল কীভাবে ডাউনলোড করবেন?


443

আমি তৃতীয় পক্ষের লাইব্রেরি ব্যবহার না করে নোড.জেএস দিয়ে একটি ফাইল কীভাবে ডাউনলোড করব ?

আমার বিশেষ কিছু লাগবে না। আমি কেবল একটি প্রদত্ত ইউআরএল থেকে একটি ফাইল ডাউনলোড করতে চাই এবং তারপরে একটি প্রদত্ত ডিরেক্টরিতে এটি সংরক্ষণ করতে চাই।


5
"নোড.জেএস দিয়ে একটি ফাইল ডাউনলোড করুন" - আপনি কি সার্ভারে আপলোড করতে চান? বা আপনার সার্ভার ব্যবহার করে কোনও রিমোট সার্ভার থেকে কোনও ফাইল পুনরুদ্ধার করবেন? বা আপনার নোড.জেএস সার্ভার থেকে ডাউনলোডের জন্য ক্লায়েন্টকে কোনও ফাইল সরবরাহ করবেন?
জোসেফ

66
"আমি কেবল একটি প্রদত্ত ইউআরএল থেকে একটি ফাইল ডাউনলোড করতে চাই এবং তারপরে একটি নির্দিষ্ট ডিরেক্টরিতে এটি সংরক্ষণ করতে চাই" এটি বেশ পরিষ্কার বলে মনে হচ্ছে। :)
মিশেল টিলি

34
জোসেফ একটি ভুল দাবী করছেন যে সমস্ত নোড প্রক্রিয়াগুলি সার্ভার প্রক্রিয়াগুলি হয়
নেতৃত্বাধীন

1
@lededje সার্ভারের কোনও প্রক্রিয়া কোনও ফাইল ডাউনলোড করে সার্ভারের ডিরেক্টরিতে এটি সংরক্ষণ করা থেকে বাধা দেয়? এটি প্রাকৃতিকভাবে করণীয়।
গেরম্যান

উত্তর:


598

আপনি এইচটিটিপি 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 উল্লেখ মত - - আপনি কমান্ড লাইন তথ্য সংগ্রহ সমর্থন করার জন্য চান ভালো কিছু খুঁজে বার করো কমান্ডার


3
আমি নিম্নলিখিত কনসোল আউটপুট পেয়েছিলাম যখন আমি এই স্ক্রিপ্টের দৌড়াতে 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)।
মিশেল টিলি

8
এই কোডটি স্ক্রিপ্ট শেষ হয়ে গেলে ফাইলটি সঠিকভাবে বন্ধ করে দেয় বা এটি ডেটা হারাবে?
ফিলিপ

2
@ কোয়ান্টাম্পোটোটো আপনার অনুরোধটি থেকে আপনি যে প্রতিক্রিয়া ফিরে পেয়েছেন তা একবার দেখুন
মিশেল

6
এটি রেকর্ড ইউআরএল টাইপের উপর নির্ভর করে যদি আপনি অনুরোধ করে থাকেন তবে httpsআপনাকে অবশ্যই ব্যবহার করতে হবে httpsঅন্যথায় এটি ত্রুটি ফেলে দেবে।
কৃষ্ণদাস পিসি

523

ভুলগুলি হ্যান্ডেল করতে ভুলবেন না! নিম্নলিখিত কোড অগস্টো রোমানের উত্তরের উপর ভিত্তি করে।

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);
  });
};

2
@ ভিনস-ইউয়ান download()নিজেই pipeসক্ষম?
raxx

@ থ্রে গ্রেফক্স কারণ এই উত্তরের কোডটি গ্রহণযোগ্যটির চেয়ে অনেক দীর্ঘ। :)
pootow

2
@ আবদুলের মতো আপনার মতামত নোড.জেএস / জাভাস্ক্রিপ্টে খুব নতুন। এই টিউটোরিয়ালটি একবার দেখুন: টিউটোরিয়ালপয়েন্ট / নোডজস / নোডজেস_ক্যালব্যাকস_কন্টপট.টিএম এটি জটিল নয়।
ভিন্স ইউয়ান

1
@ আবদুল সম্ভবত আপনি যদি ক্লাসের বাকী অংশটি ভাগ করে নিয়েছেন তা কি ভাল লাগবে?
কার্টওয়াগনার 1984

5
ডাউনলোডের গতি দেখার উপায় আছে কি? কত এমবি / গুলি ট্র্যাক করতে পারেন পছন্দ? ধন্যবাদ!
টিনো কায়ার

137

মিশেল টিলি যেমন বলেছেন, তবে উপযুক্ত নিয়ন্ত্রণ প্রবাহের সাথে:

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, স্পষ্টভাবে বলা হয় না।


3
কলব্যাক আমাকে বিভ্রান্ত করছে। আমি যদি এখন প্রার্থনা করি তবে আমি download()কীভাবে এটি করব? আমি cbযুক্তি হিসাবে কি রাখব ? আমার কাছে download('someURI', '/some/destination', cb)তবে সিবিতে কী রাখবেন তা বুঝতে পারছি না
আব্দুল

1
@ আবদুল আপনি ফাইলটি সফলভাবে আনার সময় আপনার যদি কিছু করার দরকার হয় তবেই আপনি একটি ফাংশন সহ কলব্যাক নির্দিষ্ট করেন।
ক্যাটালিনবার্টা

65

ত্রুটিগুলি পরিচালনা করার কথা বললে অনুরোধ ত্রুটিগুলি শুনতে আরও ভাল শোনা। আমি এমনকি প্রতিক্রিয়া কোড পরীক্ষা করে বৈধতা চাই। এখানে এটি কেবল 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);
    });
};

2
অনুরোধ মডিউল কেবল HTTP- র জন্য সরাসরি কাজ করে। শান্ত!
থিয়াগো সি এস ভেনতুরা

@ ভেন্টুরা হ্যাঁ, বিটিডব্লিউ, এমন একটি নেটিভ https মডিউল রয়েছে যা এখন নিরাপদ সংযোগগুলি পরিচালনা করতে পারে।
বুজুত

এটি সন্দেহ ছাড়াই আরও ত্রুটিযুক্ত। যাইহোক, যে কোনও ক্ষেত্রে যেখানে অনুরোধ মডিউলটি ব্যবহার করা একটি বিকল্প, আমি এটিকে এটি উচ্চতর স্তরের এবং এভাবে সহজ এবং দক্ষ হিসাবে পরামর্শ দেব।
বুজুত

2
@ অ্যালেক্স, না, এটি একটি ত্রুটি বার্তা এবং এর মধ্যে একটি ফিরতি আছে। সুতরাং response.statusCode !== 200সিবি অন finishকখনও কল করা হবে না।
বুজুত

1
অনুরোধ মডিউল ব্যবহার করে উদাহরণ দেখানোর জন্য আপনাকে ধন্যবাদ।
পিট অ্যালভিন

48

জিএফএক্সমোনকের উত্তরটির কলব্যাক এবং 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কলব্যাকের কাছাকাছি সময় নির্ধারণ না করে আপনি ফাইলটি অ্যাক্সেস করতে এবং ফাইলটি প্রস্তুত হওয়ার মধ্যে একটি দৌড় পেতে পারেন।


2
আপনি কোন ভেরিয়েবলের জন্য অনুরোধ সংরক্ষণ করছেন?
polkovnikov.ph

তিনি এটিকে পরিবর্তনশীল হিসাবে "সঞ্চয়" করেন যাতে এটি ডিফল্টরূপে বৈশ্বিক পরিবর্তনশীল হয়ে ওঠে না।
ফিলিপ

@ ফিল্ক আপনি কীভাবে জানবেন যে অপসারণ করা গেলে বৈশ্বিক পরিবর্তনশীল তৈরি var request =হয়?
ma11 শেই

আপনি ঠিক বলেছেন, অনুরোধটি সংরক্ষণ করার দরকার নেই, এটি কোনওভাবেই ব্যবহৃত হয় না। এটাই বলতে চাইছিস?
ফিলিপ

17

সম্ভবত নোড.জেএস পরিবর্তিত হয়েছে, তবে মনে হচ্ছে অন্যান্য সমাধানগুলিতে কিছু সমস্যা রয়েছে (নোড ভি 8.1.2 ব্যবহার করে):

  1. আপনাকে কল করার প্রয়োজন হবে না file.close()যে finishইভেন্ট। ডিফল্টরূপে fs.createWriteStreamঅটোক্লোজে সেট করা আছে: https://nodejs.org/api/fs.html#fs_fs_createwritestream_path_options
  2. file.close()ত্রুটি বলা উচিত। ফাইলটি মুছে ফেলা হলে ( unlink()) এটি প্রয়োজন হয় না তবে সাধারণত এটি হয়: https://nodejs.org/api/stream.html#stream_readable_pipe_destination_options
  3. টেম্প ফাইলটি মোছা হয় না statusCode !== 200
  4. fs.unlink() কলব্যাক ছাড়াই অবহেলা করা হয় (আউটপুট সতর্কতা)
  5. তাহলে 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);
            }
        });
    });
}

1
এ সম্পর্কে দুটি মন্তব্য: ১) এটি সম্ভবত ত্রুটিযুক্ত বস্তুগুলিকে প্রত্যাখ্যান করবে, স্ট্রিং নয়, ২) fs.unlink নিঃশব্দে ত্রুটিগুলি গ্রাস করবে যা সম্ভবত আপনি যা করতে চান তা নয়
রিচার্ড নিনাবার

1
এটি দুর্দান্ত কাজ করে! যদি আপনার URL গুলিতে HTTPS ব্যবহার, শুধু প্রতিস্থাপন const https = require("https");জন্যconst http = require("http");
Russ

15

সময়সীমা সহ সমাধান, মেমরি ফাঁস প্রতিরোধ:

নিম্নলিখিত কোডটি ব্র্যান্ডন টিলির উত্তরের উপর ভিত্তি করে:

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();
    });
});

আপনি কোনও ত্রুটি পেলে ফাইল তৈরি করবেন না এবং এক্স সেকেন্ড পরে আপনার অনুরোধটি বন্ধ করার জন্য টাইমআউট ব্যবহার করতে পছন্দ করুন।


1
এটি কেবল একটি ফাইল, এর থেকে ডাউনলোড করার জন্য কোনও প্রোটোকল বা সার্ভার নেই ...http.get("http://example.com/yourfile.html",function(){})
mjz19910

এই উত্তরে কি কোনও স্মৃতি ফাঁস হচ্ছে: stackoverflow.com/a/22793628/242933 ?
ma11 she28

আমি যেমন করেছি তেমন সময়সীমা যোগ করতে পারেন http.get। ফাইলটি ডাউনলোড হতে খুব বেশি সময় নিলে কেবল মেমরি ফাঁস হয়।
এ 312

13

যারা এস-স্টাইলের প্রতিশ্রুতি ভিত্তিক উপায়ে সন্ধানে এসেছেন, আমি অনুমান করি এটি এমন কিছু হবে:

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));

2
responseSetপতাকা সৃষ্টি করেছিল, এমন কোনও কারণে যা তদন্ত করার সময় আমার ছিল না, আমার ফাইলটি অসম্পূর্ণভাবে ডাউনলোড করা হবে। কোনও ত্রুটি পপ আপ করা হয়নি তবে .txt ফাইলটি আমি পপুল করছি যে সারিগুলির অর্ধেক থাকতে হবে। পতাকাটির জন্য যুক্তি সরিয়ে ফেলা এটি ঠিক করে দিয়েছে। কেবল কারও সাথে যোগাযোগ করতে সমস্যা থাকলে তা উল্লেখ করতে চেয়েছিলাম। তবুও, +1
মিলন ভেলেবিট

6

ভিন্স ইউয়ান এর কোড দুর্দান্ত তবে মনে হচ্ছে এটি কিছু ভুল।

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);
        });
    });
}

আমরা কি গন্তব্য ফোল্ডার নির্দিষ্ট করতে পারি?

6

আমি অনুরোধটি পছন্দ করি () কারণ আপনি এটির সাথে http এবং https উভয়ই ব্যবহার করতে পারেন।

request('http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg')
  .pipe(fs.createWriteStream('cat.jpg'))

দেখে মনে হচ্ছে অনুরোধটি github.com/request/request/issues/3142 "As of Feb 11th 2020, request is fully deprecated. No new changes are expected to land. In fact, none have landed for some time."
মাইকেল

5
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));

5

হাই , আমি মনে করি আপনি চাইল্ড_প্রসেস মডিউল এবং কার্ল কমান্ড ব্যবহার করতে পারেন ।

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()

এছাড়াও - আপনি যখন বড় 、 একাধিক ফাইল ডাউনলোড করতে চান - আপনি আরও সিপিইউ কোর ব্যবহার করতে ক্লাস্টার মডিউলটি ব্যবহার করতে পারেন ।


4

আপনি https://github.com/douzi8/ajax-request#download ব্যবহার করতে পারেন

request.download('http://res.m.ctrip.com/html5/Content/images/57.png', 
  function(err, res, body) {}
);

2
ফাইলের নামটি যদি জাপানিতে থাকে তবে আস্কি বাদে যদি ফাইলের নাম অন্য থাকে তবে এটি আবর্জনার চরিত্রটি ফিরিয়ে দিচ্ছে।
দীপক গোয়েল

4
আপনি কি মনে করেন ajax-requestকোনও তৃতীয় পক্ষের গ্রন্থাগার নয়?
মুরাত ওরলু

4

প্রতিশ্রুতি ব্যবহার করে ডাউনলোড করুন, যা একটি পঠনযোগ্য স্ট্রিম সমাধান করে। পুনর্নির্দেশ পরিচালনা করতে অতিরিক্ত যুক্তি রাখুন।

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);
    }
});

1
302 হ'ল ইউআরএল পুনর্নির্দেশের জন্য এইচটিটিপি স্থিতি কোড, সুতরাং আপনার এটি ব্যবহার করতে হবে [301,302] .indexOf (res.statusCode)! == -1 if বিবৃতিতে
সিডনমোর

প্রশ্নগুলি তৃতীয় পক্ষের মোডগুলি অন্তর্ভুক্ত না করার জন্য নির্দিষ্ট ছিল :)
ডেভিড গাট্টি

3

আপনি যদি এক্সপ্রেস ব্যবহার করুন পুনঃডাউনলোড () পদ্ধতিটি ব্যবহার করেন। অন্যথায় 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");
          }
        });  
    }

3

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 পার্থক্য"


2

পথ: 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;
}

0

লাইব্রেরি ব্যতীত এটি নির্দিষ্ট করতে বগী হতে পারে। এখানে কয়েকটি দেওয়া হল:

  • এই ইউআরএল https://calibre-ebook.com/dist/portable যা বাইনারি হয় তার মতো HTTP পুনঃনির্দেশ পরিচালনা করতে পারে না ।
  • HTTP মডিউলটি https url করতে পারে না, আপনি পাবেন Protocol "https:" not supported.

এখানে আমার পরামর্শ:

  • wgetবা মত সিস্টেম কল করুনcurl
  • নোড-উইজেট-প্রতিশ্রুতির মতো কিছু সরঞ্জাম ব্যবহার করুন যা ব্যবহার করা খুব সহজ। var wget = require('node-wget-promise'); wget('http://nodejs.org/images/logo.svg');

0
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);
  });
};

0

আপনি res.redirecthttps ফাইল ডাউনলোড url ব্যবহার করার চেষ্টা করতে পারেন এবং তারপরে এটি ফাইলটি ডাউনলোড করা হবে।

ভালো লেগেছে: res.redirect('https//static.file.com/file.txt');


0
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');
});

0

তৃতীয় পক্ষের নির্ভরতা ছাড়া এটি পরিচালনা করার এবং পুনঃনির্দেশগুলি অনুসন্ধান করার জন্য আরও একটি উপায় এখানে রয়েছে:

        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.
              });
            });
          }

0

ডাউনলোড. 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')
});

-3

আমরা ডাউনলোড নোড মডিউল এবং এটির খুব সহজ ব্যবহার করতে পারি, দয়া করে নীচে দেখুন https://www.npmjs.com/package/download


2
প্রশ্নটি "তৃতীয় পক্ষের লাইব্রেরি ব্যবহার না করে" কীভাবে করবেন তা জিজ্ঞাসা করছে।
ma11 শেই

-4
var requestModule=require("request");

requestModule(filePath).pipe(fs.createWriteStream('abc.zip'));

5
কোড ডাম্পগুলি সাধারণত কার্যকর হয় না এবং ডাউনভোট বা মোছা হতে পারে। ভবিষ্যতে দর্শনার্থীদের জন্য কোডটি কী করছে তা কমপক্ষে ব্যাখ্যা করার জন্য এটি সম্পাদনযোগ্য।
বাগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.