बेस 64 एनकोडेड इमेज को Amazon S3 पर Node.js के माध्यम से अपलोड करना


99

कल मैंने एक गहरी रात कोडिंग सत्र किया और एक छोटा नोड बनाया। जेएस / जेएस (वास्तव में कॉफीस्क्रिप्ट, लेकिन कॉफीस्क्रिप्ट सिर्फ जावास्क्रिप्ट है इसलिए जेएस कहते हैं) ऐप।

क्या लक्ष्य है:

  1. क्लाइंट सर्वर पर एक सॉकेट डेटा (png) भेजता है (सॉकेट के माध्यम से)
  2. सर्वर am3 s3 के लिए छवि अपलोड करता है

चरण 1 किया जाता है।

सर्वर अब एक स्ट्रिंग एक ला है

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACt...

मेरा प्रश्न है: अमेज़न S3 पर इस डेटा को "स्ट्रीम" करने / अपलोड करने के लिए मेरे अगले चरण क्या हैं और वहां एक वास्तविक छवि बनाएं?

knox https://github.com/LearnBoost/knox ऐसा लगता है कि S3 के लिए कुछ करने के लिए PUT के लिए एक बहुत बढ़िया काम है, लेकिन मुझे जो याद आ रहा है वह आधार 64-एन्कोडेड-इमेज-स्ट्रिंग और वास्तविक अपलोड एक्शन के बीच का गोंद है ?

किसी भी विचार, संकेत और प्रतिक्रिया का स्वागत करते हैं।


4
इस उत्तर को जांचें: stackoverflow.com/questions/5867534/…
akirk

जवाबों:


209

उन लोगों के लिए जो अभी भी इस मुद्दे से जूझ रहे हैं। यहाँ वह दृष्टिकोण है जिसका उपयोग मैंने देशी एन्स-एसडीके के साथ किया था।

var AWS = require('aws-sdk');
AWS.config.loadFromPath('./s3_config.json');
var s3Bucket = new AWS.S3( { params: {Bucket: 'myBucket'} } );

अपनी राउटर विधि के अंदर: - कंटेंट टाइप को इमेज फाइल के कंटेंट टाइप पर सेट किया जाना चाहिए

  buf = Buffer.from(req.body.imageBinary.replace(/^data:image\/\w+;base64,/, ""),'base64')
  var data = {
    Key: req.body.userId, 
    Body: buf,
    ContentEncoding: 'base64',
    ContentType: 'image/jpeg'
  };
  s3Bucket.putObject(data, function(err, data){
      if (err) { 
        console.log(err);
        console.log('Error uploading data: ', data); 
      } else {
        console.log('succesfully uploaded the image!');
      }
  });

s3_config.json फ़ाइल है: -

{
  "accessKeyId":"xxxxxxxxxxxxxxxx",
  "secretAccessKey":"xxxxxxxxxxxxxx",
  "region":"us-east-1"
}

2
[MissingRequiredParameter: लापता आवश्यक कुंजी पैरामीटर में 'कुंजी']
निकोल ए Miler

1
कुंजी: req.body.userId मैंने पोस्ट डेटा में कुंजी के रूप में userId का उपयोग किया ... यह लंबे समय से वापस था ... लेकिन आप किसी भी स्ट्रिंग को कुंजी के रूप में घोषित कर सकते हैं। यह सुनिश्चित करने के लिए कि पहले से मौजूद फाइलें अधिलेखित नहीं हैं, कुंजी को अद्वितीय रखें।
दिव्यांशु दास

@ दिव्यांशु ऐसे उपयोगी उदाहरण के लिए धन्यवाद। मुझे दो संदेह हुए: How to make S3 generates a unique KEY to prevent from overriding files?और If I don't set the ContentType, when I download the files I won't be able to get the correct file?मेरा मतलब है, मुझे ऐसी भ्रष्ट फाइल मिलेगी? अग्रिम में धन्यवाद!
अलेक्सवेंटुरायो

2
@ मार्कर स्थान पथ मूल रूप से कुंजी है - जैसे कि अगर आपकी बाल्टी का नाम है - बाल्टी और कुंजी का नाम xyz.png है, तो फ़ाइल पथ bucketone.s3.amazonaws.com/xyz.png
दास

2
@ दिव्यांशु इस बेहतरीन जवाब के लिए धन्यवाद! इसने मेरी बहुत मदद की। हालाँकि, मुझे लगता ContentEncoding: 'base64'है कि सही नहीं है क्योंकि new Buffer(..., 'base64')इसके बाइनरी प्रतिनिधित्व में बेस 64-एन्कोडेड स्ट्रिंग को डिकोड किया गया है।
शुही कागवा

17

ठीक है, यह एक जवाब है कि कैनवास डेटा को फ़ाइल में कैसे सहेजना है

मूल रूप से यह मेरे कोड में इस तरह से ढीला है

buf = new Buffer(data.dataurl.replace(/^data:image\/\w+;base64,/, ""),'base64')


req = knoxClient.put('/images/'+filename, {
             'Content-Length': buf.length,
             'Content-Type':'image/png'
  })

req.on('response', (res) ->
  if res.statusCode is 200
      console.log('saved to %s', req.url)
      socket.emit('upload success', imgurl: req.url)
  else
      console.log('error %d', req.statusCode)
  )

req.end(buf)

1
बफ़र ऑब्जेक्ट एक त्रुटि फेंक देगा "बफ़र परिभाषित नहीं" क्या आप मुझे उसके लिए समाधान दे सकते हैं।
नवीन

मुझे भी वही त्रुटि मिल रही है। आपको कोई समाधान मिला या नहीं
कृष्ण

1
@ नवीन यह एक नोड उदाहरण है, शायद आप सादे जेएस का उपयोग कर रहे हैं?
प्वाइंटी

7

यहाँ एक लेख से आया कोड, नीचे पोस्ट कर रहा हूँ:

const imageUpload = async (base64) => {

  const AWS = require('aws-sdk');

  const { ACCESS_KEY_ID, SECRET_ACCESS_KEY, AWS_REGION, S3_BUCKET } = process.env;

  AWS.config.setPromisesDependency(require('bluebird'));
  AWS.config.update({ accessKeyId: ACCESS_KEY_ID, secretAccessKey: SECRET_ACCESS_KEY, region: AWS_REGION });

  const s3 = new AWS.S3();

  const base64Data = new Buffer.from(base64.replace(/^data:image\/\w+;base64,/, ""), 'base64');

  const type = base64.split(';')[0].split('/')[1];

  const userId = 1;

  const params = {
    Bucket: S3_BUCKET,
    Key: `${userId}.${type}`, // type is not required
    Body: base64Data,
    ACL: 'public-read',
    ContentEncoding: 'base64', // required
    ContentType: `image/${type}` // required. Notice the back ticks
  }

  let location = '';
  let key = '';
  try {
    const { Location, Key } = await s3.upload(params).promise();
    location = Location;
    key = Key;
  } catch (error) {
  }

  console.log(location, key);

  return location;

}

module.exports = imageUpload;

और पढ़ें: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#upload-property

क्रेडिट: https://medium.com/@mayneweb/upload-a-base64-image-data-from-nodejs-to-aws-s3-bucket-6c1bd945520ff


4

स्वीकृत उत्तर बहुत अच्छा काम करता है, लेकिन अगर किसी को किसी भी फाइल को स्वीकार करने की आवश्यकता है तो केवल छवियों के बजाय यह rexxp महान काम करता है:

/^data:.+;base64,/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.