Node.js में POST अनुरोध का उपयोग कर फ़ाइल अपलोड कर रहा है




multipartform-data http-post (4)

ऐसा लगता है कि आप पहले ही request मॉड्यूल का उपयोग कर रहे हैं।

इस मामले में आपको multipart/form-data पोस्ट करने की आवश्यकता है, इसकी form सुविधा का उपयोग form है :

var req = request.post(url, function (err, resp, body) {
  if (err) {
    console.log('Error!');
  } else {
    console.log('URL: ' + body);
  }
});
var form = req.form();
form.append('file', '<FILE_DATA>', {
  filename: 'myfile.txt',
  contentType: 'text/plain'
});

लेकिन अगर आप अपनी फाइल सिस्टम से कुछ मौजूदा फाइल पोस्ट करना चाहते हैं, तो आप इसे आसानी से पठनीय स्ट्रीम के रूप में पास कर सकते हैं:

form.append('file', fs.createReadStream(filepath));

request सभी संबंधित मेटाडेटा को स्वयं ही निकाल देगा।

multipart/form-data पोस्ट करने के बारे में अधिक जानकारी के लिए node-form-data मॉड्यूल देखें , जिसे आंतरिक रूप से request द्वारा उपयोग किया जाता है।

मुझे Node.js. में POST अनुरोध का उपयोग कर फ़ाइल अपलोड करने में समस्या है। मुझे यह पूरा करने के लिए request मॉड्यूल का उपयोग करना है (कोई बाहरी एनपीएमएस)। सर्वर को file फ़ील्ड वाले फाइल फ़ील्ड के साथ मल्टीपार्ट अनुरोध होने की आवश्यकता है। ऐसा लगता है कि किसी बाहरी मॉड्यूल का उपयोग किये बिना नोड.जेएस में करना बहुत मुश्किल है।

मैंने इस उदाहरण का उपयोग करने की कोशिश की है लेकिन सफलता के बिना:

request.post({
  uri: url,
  method: 'POST',
  multipart: [{
    body: '<FILE_DATA>'
  }]
}, function (err, resp, body) {
  if (err) {
    console.log('Error!');
  } else {
    console.log('URL: ' + body);
  }
});

लियोनिद Beschastny का जवाब काम करता है, लेकिन मुझे भी ArrayBuffer को बफर में परिवर्तित करना पड़ा जो कि नोड के request मॉड्यूल में उपयोग किया जाता है। सर्वर पर फ़ाइल अपलोड करने के बाद, मैंने इसे उसी प्रारूप में रखा जो एचटीएमएल 5 फाइलएपीआई से आता है (मैं उल्का का उपयोग कर रहा हूं)। नीचे पूरा कोड - शायद यह दूसरों के लिए सहायक होगा।

function toBuffer(ab) {
  var buffer = new Buffer(ab.byteLength);
  var view = new Uint8Array(ab);
  for (var i = 0; i < buffer.length; ++i) {
    buffer[i] = view[i];
  }
  return buffer;
}

var req = request.post(url, function (err, resp, body) {
  if (err) {
    console.log('Error!');
  } else {
    console.log('URL: ' + body);
  }
});
var form = req.form();
form.append('file', toBuffer(file.data), {
  filename: file.name,
  contentType: file.type
});

आप अनुरोध पुस्तकालय से "कस्टम विकल्प" समर्थन का भी उपयोग कर सकते हैं। यह प्रारूप आपको बहु-भाग फ़ॉर्म अपलोड बनाने की अनुमति देता है, लेकिन फाइल और अतिरिक्त फॉर्म जानकारी जैसे फ़ाइल नाम या सामग्री-प्रकार दोनों के लिए संयुक्त प्रविष्टि के साथ। मैंने पाया है कि कुछ पुस्तकालयों को इस प्रारूप का उपयोग करके फाइल अपलोड प्राप्त करने की उम्मीद है, खासकर मल्टीटर जैसे पुस्तकालय।

यह दृष्टिकोण आधिकारिक तौर पर अनुरोध दस्तावेज़ों के रूप अनुभाग में दस्तावेज किया गया है - https://github.com/request/request#forms

//toUpload is the name of the input file: <input type="file" name="toUpload">

let fileToUpload = req.file;

let formData = {
    toUpload: {
      value: fs.createReadStream(path.join(__dirname, '..', '..','upload', fileToUpload.filename)),
      options: {
        filename: fileToUpload.originalname,
        contentType: fileToUpload.mimeType
      }
    }
  };
let options = {
    url: url,
    method: 'POST',
    formData: formData
  }
request(options, function (err, resp, body) {
    if (err)
      cb(err);

    if (!err && resp.statusCode == 200) {
      cb(null, body);
    }
  });

formData फ़ील्ड की एक formData विशेषता जो लागू करने का request है वह form-data मॉड्यूल के विकल्पों को पारित करने की क्षमता है:

request({
  url: 'http://example.com',
  method: 'POST',
  formData: {
    'regularField': 'someValue',
    'regularFile': someFileStream,
    'customBufferFile': {
      value: fileBufferData,
      options: {
        filename: 'myfile.bin'
      }
    }
  }
}, handleResponse);

यह उपयोगी है अगर आपको requestObj.form() कॉल करने से बचने की आवश्यकता है लेकिन फ़ाइल के रूप में बफर अपलोड करने की आवश्यकता है। form-data मॉड्यूल सामग्री टाइप (एमआईएमई प्रकार) और knownLength विकल्प भी स्वीकार करता है।

यह परिवर्तन अक्टूबर 2014 में जोड़ा गया था (इसलिए इस प्रश्न के 2 महीने बाद पूछा गया था), इसलिए अब इसका उपयोग सुरक्षित होना चाहिए (2017+ में)। यह संस्करण v2.46.0 या request ऊपर के बराबर है।





http-post