ठीक है तो मैंने पहले ही कनेक्ट-फॉर्म का उपयोग करने का प्रयास किया है और मैं इसे किसी कारण से काम नहीं कर सका, लेकिन मुझे लगता है कि मुझे यह समझना चाहिए कि यह बिना किसी खरोंच से अर्ध कैसे काम करता है।

मैं समझ नहीं पा रहा हूं कि मेरे द्वारा अपलोड की गई मल्टीपार्ट/फॉर्मडेटा फ़ाइल कहां जा रही है, या यूआरएल पर पोस्ट होने पर मैं इसे अपने ऐप में कैसे एक्सेस कर सकता हूं। - Id फ़ाइल डेटा को डायरेक्ट एक्सेस करना चाहता है, और नोड fs मॉड्यूल का उपयोग करके फ़ाइल आउटपुट लिखना चाहता है। -- उदाहरण के लिए:

    app.post('/testy', function(req, res){
       console.log(req.body);
       console.log(req.headers);
       res.redirect('back');

    });  

    app.get('/testy', function(req, res){
      res.send('<form method="post" action="/testy" enctype="multipart/form-data">'
        + '<p>Image: <input type="file" name="test" /></p>'
        + '<p><input type="submit" value="Upload" /></p>'
        + '</form>');
    });

तो एकमात्र req var जो वास्तव में लॉग किया जा रहा है, वहां req शीर्षलेख है, शरीर खाली है। (शायद माना जाता है कि मैं इसे समझता हूं)। लेकिन मुझे जो नहीं मिलता है वह यह है कि फ़ाइल डेटा कहाँ है? मुझे लगता है कि $ _FILES सरणी के PHP equiv की तलाश में है। -- यहाँ मेरे हेडर लॉग किए गए हैं।

'accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'accept-language': 'en-us,en;q=0.5',
'accept-encoding': 'gzip,deflate',
'accept-charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
'keep-alive': '115',
connection: 'keep-alive',
referer: 'http://127.0.0.1:3000/testy',
cookie: 'connect.sid=lDRpluTxjUJeuTmkXlybrYeZ.JYTB155s2DGce2dsyfv1Op5ISCY8uqyqJZK8NjlZ5jM; socketio=flashsocket',
'x-insight': 'activate',
'content-type': 'multipart/form-data; boundary=---------------------------5856401949371863571646035001',
'content-length': '30128' }

मैं जो कुछ भी याद कर रहा हूं उस पर कोई प्रकाश डाला गया हमेशा की सराहना की!

5
thrice801 16 जून 2011, 06:20

2 जवाब

सबसे बढ़िया उत्तर

कनेक्ट-फॉर्म के बिना यहां बहुत वर्बोज़ संस्करण है। जैसा कि आप देख सकते हैं, यह कुशल नहीं है लेकिन यह कैसे काम करता है इसके बारे में शिक्षाप्रद होने की कोशिश कर रहा है।

var express = require('express'),
    fs = require('fs');
    app = express.createServer();

app.post('/testy', function(req, res){
  var body = '';
  var header = '';
  var content_type = req.headers['content-type'];
  var boundary = content_type.split('; ')[1].split('=')[1];
  var content_length = parseInt(req.headers['content-length']);
  var headerFlag = true;
  var filename = 'dummy.bin';
  var filenameRegexp = /filename="(.*)"/m;
  console.log('content-type: ' + content_type);
  console.log('boundary: ' + boundary);
  console.log('content-length: ' + content_length);

  req.on('data', function(raw) {
    console.log('received data length: ' + raw.length);
    var i = 0;
    while (i < raw.length)
      if (headerFlag) {
        var chars = raw.slice(i, i+4).toString();
        if (chars === '\r\n\r\n') {
          headerFlag = false;
          header = raw.slice(0, i+4).toString();
          console.log('header length: ' + header.length);
          console.log('header: ');
          console.log(header);
          i = i + 4;
          // get the filename
          var result = filenameRegexp.exec(header);
          if (result[1]) {
            filename = result[1];
          }
          console.log('filename: ' + filename);
          console.log('header done');
        }
        else {
          i += 1;
        }
      }
      else { 
        // parsing body including footer
        body += raw.toString('binary', i, raw.length);
        i = raw.length;
        console.log('actual file size: ' + body.length);
      }
  });

  req.on('end', function() {
    // removing footer '\r\n'--boundary--\r\n' = (boundary.length + 8)
    body = body.slice(0, body.length - (boundary.length + 8))
    console.log('final file size: ' + body.length);
    fs.writeFileSync('files/' + filename, body, 'binary');
    console.log('done');
    res.redirect('back');
  })
});  

app.get('/testy', function(req, res){
  res.send('<form method="post" action="/testy" enctype="multipart/form-data">'
           + '<p>Image: <input type="file" name="test" /></p>'
           + '<p><input type="submit" value="Upload" /></p>'
           + '</form>');
});

app.listen(4000);
11
ghiden 1 जुलाई 2011, 16:05
1
जाने के लिए रास्ता! यह वास्तव में आश्चर्यजनक है कि वेब पर कितने अपलोड उदाहरण काम नहीं करते हैं।
 – 
james_womack
30 अप्रैल 2012, 20:29
मुझे विश्वास नहीं हो रहा है कि यह वास्तव में काम करता है! मैं पूरे दिन एक काम की तलाश में था!
 – 
user240993
2 अगस्त 2012, 23:36
यह काम नहीं करता है क्योंकि नोडज का एपीआई बार-बार बदल रहा है। यह 1 जुलाई 2011 को लिखा गया था, और आपने 9 महीने के बाद 30 अप्रैल 2012 को टिप्पणी की थी।
 – 
Hitesh Joshi
3 अक्टूबर 2012, 07:04
मैं यह नहीं कह रहा था कि यह उदाहरण काम नहीं किया। मैं इस उदाहरण की तारीफ कर रहा था क्योंकि इसने मेरे लिए किया काम किया।
 – 
james_womack
3 अक्टूबर 2012, 22:18
1
अरे! माफ़ करना। पढ़कर मुझे नींद आ रही थी। आप एक कोडर का जीवन जानते हैं: पी, कृपया अनदेखा करें।
 – 
Hitesh Joshi
4 अक्टूबर 2012, 00:38

मैं कनेक्ट-फॉर्म पैकेज को अंत में काम करने में सक्षम था, धोखेबाज़ गलती लेकिन, यदि आप एक्सप्रेस का उपयोग कर रहे हैं तो सुनिश्चित करें कि आप ऐप को अपने कॉन्फिग फ़ंक्शन के भीतर फॉर्म मॉड्यूल का उपयोग करने के लिए कहें। ({रखें एक्सटेंशन: सच}));

(पोस्ट में यह files.yourfileuploadfieldname.filename वेरिएबल में होगा)

- इसके साथ ही मुझे अभी भी यह जानने में दिलचस्पी है कि इसे बिना किसी कनेक्ट-फॉर्म के स्क्रैच से कैसे किया जाए, अगर इसकी व्याख्या करना अविश्वसनीय रूप से कठिन नहीं है।

1
thrice801 16 जून 2011, 23:22