এক্সপ্রেস ব্যবহার করে নোডজেএস সার্ভার থেকে একটি ফাইল ডাউনলোড করুন


317

নোডজেএস সার্ভারের কোনও পৃষ্ঠাতে অ্যাক্সেস করা আমার মেশিনে আমার সার্ভারে থাকা কোনও ফাইল আমি কীভাবে ডাউনলোড করতে পারি?

আমি এক্সপ্রেসজেএস ব্যবহার করছি এবং আমি এটি চেষ্টা করে যাচ্ছি:

app.get('/download', function(req, res){

  var file = fs.readFileSync(__dirname + '/upload-folder/dramaticpenguin.MOV', 'binary');

  res.setHeader('Content-Length', file.length);
  res.write(file, 'binary');
  res.end();
});

তবে আমি ফাইলের নাম এবং ফাইলের ধরণ (বা এক্সটেনশন) পেতে পারি না। কেউ কি আমাকে এতে সহায়তা করতে পারে?


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

3
আপ-ভোট প্রমাণ করে যে বোবা প্রশ্নের মতো কোনও জিনিস নেই :)
ব্যবহারকার 2180794

2
@ ব্যবহারকারী 2180794 তবে এমন একটি জিনিস রয়েছে। পতাকাঙ্কিত এবং নিচে ভোট হওয়া এমন আরও অনেক প্রশ্নই এর প্রমাণ। এই প্রশ্নটি অবশ্যই একটি নয়। এটি গাইডলাইনগুলির সাথে মেলে :)
এসিলেটার

আপনি যে প্রশ্নটি দেখিয়েছেন তা আলাদা, এখানে ওপি ক্লায়েন্টকে কোনও ফাইল ফিরিয়ে দিতে চায় যখন এই অন্য প্রশ্নটি কীভাবে আপনার সার্ভার নোডকে ক্লায়েন্ট হিসাবে ব্যবহার করতে পারে (যেমন 3 য় পক্ষের কোনও ফাইল)। কমপক্ষে এটাই আমি বুঝতে পেরেছিলাম।
এরিক বুরেল

উত্তর:


585

হালনাগাদ

জীবনকে সহজ করার জন্য এক্সপ্রেসের একটি সহায়ক রয়েছে

app.get('/download', function(req, res){
  const file = `${__dirname}/upload-folder/dramaticpenguin.MOV`;
  res.download(file); // Set disposition and send it.
});

পুরানো উত্তর

আপনার ব্রাউজারটি যতটা উদ্বিগ্ন, ফাইলটির নাম কেবল 'ডাউনলোড', সুতরাং আপনাকে অন্য একটি এইচটিটিপি শিরোনাম ব্যবহার করে আরও তথ্য দেওয়া দরকার।

res.setHeader('Content-disposition', 'attachment; filename=dramaticpenguin.MOV');

আপনি মাইম-টাইপ যেমন পাঠাতে চাইতে পারেন:

res.setHeader('Content-type', 'video/quicktime');

আপনি যদি আরও গভীরতর কিছু চান, তবে এখানে যান।

var path = require('path');
var mime = require('mime');
var fs = require('fs');

app.get('/download', function(req, res){

  var file = __dirname + '/upload-folder/dramaticpenguin.MOV';

  var filename = path.basename(file);
  var mimetype = mime.lookup(file);

  res.setHeader('Content-disposition', 'attachment; filename=' + filename);
  res.setHeader('Content-type', mimetype);

  var filestream = fs.createReadStream(file);
  filestream.pipe(res);
});

আপনি যা পছন্দ করেন তাতে আপনি শিরোনাম মান সেট করতে পারেন। এই ক্ষেত্রে, আমি মাইম-টাইপ লাইব্রেরি ব্যবহার করছি - নোড-মাইম , ফাইলটির মাইম-টাইপ কি তা পরীক্ষা করতে।

এখানে অন্য একটি গুরুত্বপূর্ণ বিষয় লক্ষণীয় হ'ল আমি আপনার কোডটি একটি পঠন স্ট্রিম ব্যবহারের জন্য পরিবর্তন করেছি। জিনিসগুলি করার এটি একটি আরও ভাল উপায় কারণ নামের সাথে 'সিঙ্ক' সহ যে কোনও পদ্ধতি ব্যবহার করা ভ্রান্ত হয় কারণ নোডকে অ্যাসিঙ্ক্রোনাস বোঝানো হয়।


3
ধন্যবাদ .. fs.readFileSync থেকে এই তথ্যটি পাওয়ার কোনও উপায় আছে কি? আমি এই উদাহরণে একটি স্ট্যাটিক ফাইল ব্যবহার করছি তবে আমি কোনও ফাইলের জন্য এই ডাউনলোড এপিআই এর নামটি পাস করে ব্যবহার করব।
থিয়াগো মিরান্ডা ডি অলিভিরা

আউটপুট ফাইলের নাম সেট করা res.setHeader('Content-disposition', 'attachment; filename=' + filename);টিএনএক্সের সাথে কাজ করে !
কেপি

পুনঃডাউনলোড () পদ্ধতিটি ব্যবহার করে একাধিক ডকুমেন্ট কীভাবে ডাউনলোড করবেন।
আর জে

1
@RJ। আপনার যদি প্রশ্ন থাকে তবে একটি নতুন তৈরি করুন, কোনও মন্তব্য করবেন না।
লগানফস্মিথ

7
4.x ব্যবহারসমূহ এক্সপ্রেস .set()পরিবর্তে .setHeader()BTW
ডানা কাঠুরিয়া

48

ব্যবহার res.download()

এটি ফাইলটিকে "সংযুক্তি" হিসাবে স্থানান্তরিত করে। এই ক্ষেত্রে:

var express = require('express');
var router = express.Router();

// ...

router.get('/:id/download', function (req, res, next) {
    var filePath = "/my/file/path/..."; // Or format the path using the `id` rest param
    var fileName = "report.pdf"; // The default name the browser will use

    res.download(filePath, fileName);    
});

6
যদি কোনও ফাইলের পরিবর্তে এইচটিটিপি অনুরোধ থেকে ডেটা আসে এবং আমরা ব্যবহারকারীদের স্ট্রিমিং উপায়ে ফাইলটি ডাউনলোড করতে দিতে পারি?
গ্রীষ্মকালীন রাত

1
@ সুমারনাইট - ঠিক আছে, এটি নির্দিষ্ট করা প্রশ্নের চেয়ে আলাদা মামলা। nodejs proxy file download responseসেরা অনুশীলনের জন্য অনুসন্ধান করুন
জোসেফ হারুশ

15

স্ট্যাটিক ফাইলের মতো পিডিএফএস, ওয়ার্ড ডক্স ইত্যাদির জন্য আপনার কনফিগারেশনে এক্সপ্রেসের স্থির ফাংশনটি ব্যবহার করুন:

// Express config
var app = express().configure(function () {
    this.use('/public', express.static('public')); // <-- This right here
});

এবং তারপরে আপনার সমস্ত ফাইলগুলি সেই 'পাবলিক' ফোল্ডারের ভিতরে রেখে দিন, উদাহরণস্বরূপ:

/public/docs/my_word_doc.docx

এবং তারপরে একটি নিয়মিত পুরানো লিঙ্কটি ব্যবহারকারী এটি ডাউনলোড করতে দেয়:

<a href="public/docs/my_word_doc.docx">My Word Doc</a>

1
এটি সম্পদের জন্য ভাল কাজ করে (যদিও এনগিনেক্সের মতো উত্সর্গীকৃত প্রক্সি প্রস্তাবিত হয়)। তবে যে কোনও কিছুর জন্য সুরক্ষিত অ্যাক্সেসের প্রয়োজন, স্বীকৃত পদ্ধতি আরও ভাল। সাধারণত ডকস এবং তথ্যযুক্ত ফাইলের জন্য কথা বলার জন্য, আমি সর্বজনীন পদ্ধতিটি ব্যবহার করার পরামর্শ দেব না।
নিমবল্টন

1
আপনি উপযুক্ত ব্যবহারকারীরা ফাইলগুলি অ্যাক্সেস করতে পারবেন তা নিশ্চিত করার জন্য আপনি মিডলওয়্যার যুক্ত করতে পারেন
ম্যালকমমিশন

1
উদাহরণস্বরূপ this.use('/topsecret', mGetLoggedInUser, mEnsureAccess, express.static('topsecret'))... এবং তারপরে প্রতিটি অনুরোধ mEnsureAccess এর মধ্য দিয়ে যায়। অবশ্যই, এর অর্থ হ'ল সুরক্ষিত নথির ইউআরএল বা যা-ই হোক না কেন ভিত্তিতে আপনাকে ব্যবহারকারীর অ্যাক্সেস স্তরটি বের করতে সক্ষম হতে হবে।
ম্যালকমমিশন

14

এক্সপ্রেস ৪.x এ, এখানে একটি attachment()পদ্ধতি রয়েছে Response:

res.attachment();
// Content-Disposition: attachment

res.attachment('path/to/logo.png');
// Content-Disposition: attachment; filename="logo.png"
// Content-Type: image/png

6
'use strict';

var express = require('express');
var fs = require('fs');
var compress = require('compression');
var bodyParser = require('body-parser');

var app = express();
app.set('port', 9999);
app.use(bodyParser.json({ limit: '1mb' }));
app.use(compress());

app.use(function (req, res, next) {
    req.setTimeout(3600000)
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept,' + Object.keys(req.headers).join());

    if (req.method === 'OPTIONS') {
        res.write(':)');
        res.end();
    } else next();
});

function readApp(req,res) {
  var file = req.originalUrl == "/read-android" ? "Android.apk" : "Ios.ipa",
      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");
      }
    });  
}

app.get('/read-android', function(req, res) {
    var u = {"originalUrl":req.originalUrl};
    readApp(u,res) 
});

app.get('/read-ios', function(req, res) {
    var u = {"originalUrl":req.originalUrl};
    readApp(u,res) 
});

var server = app.listen(app.get('port'), function() {
    console.log('Express server listening on port ' + server.address().port);
});

4

আমি এটি কীভাবে করব তা এখানে:

  1. ফাইল তৈরি করুন
  2. ক্লায়েন্ট যাও ফাইল প্রেরণ
  3. ফাইল সরান

কোড:

let fs = require('fs');
let path = require('path');

let myController = (req, res) => {
  let filename = 'myFile.ext';
  let absPath = path.join(__dirname, '/my_files/', filename);
  let relPath = path.join('./my_files', filename); // path relative to server root

  fs.writeFile(relPath, 'File content', (err) => {
    if (err) {
      console.log(err);
    }
    res.download(absPath, (err) => {
      if (err) {
        console.log(err);
      }
      fs.unlink(relPath, (err) => {
        if (err) {
          console.log(err);
        }
        console.log('FILE [' + filename + '] REMOVED!');
      });
    });
  });
};

2
অনুসন্ধানের প্রায় দুই দিনের মধ্যে আমি একমাত্র সমাধানটি খুঁজে পেয়েছি যা অডিও ফাইল পাওয়ার আমার নির্দিষ্ট দৃশ্যের জন্য কাজ করে। আমি শুধু মনে করি না যে res.download () সঙ্গে কাজ করে $ .ajax কল দুর্ভাগ্যবশত - আমি ব্যবহার ছিল window.open("/api/get_audio_file");, দেখুন: stackoverflow.com/a/20177012
user1063287
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.