নোড.জেএস এর মাধ্যমে অ্যামাজন এস 3-তে বেস 64 এনকোডযুক্ত চিত্র আপলোড করা হচ্ছে


103

গতকাল আমি একটি গভীর নাইট কোডিং সেশন করেছি এবং একটি ছোট নোড.জেএস / জেএস তৈরি করেছি (ভাল আসলে কফিস্ক্রিপ্ট, তবে কফিস্ক্রিপ্টটি কেবল জাভাস্ক্রিপ্ট তাই জেএস বলতে পারি) অ্যাপটি।

লক্ষ্য কী:

  1. ক্লায়েন্ট সার্ভারে একটি ক্যানভাস ডেটাউরি (পিএনজি) প্রেরণ করে (সকেট.ওয়ের মাধ্যমে)
  2. সার্ভার চিত্রটি অ্যামাজন এস 3 এ আপলোড করে

পদক্ষেপ 1 সম্পন্ন হয়েছে।

সার্ভারের এখন একটি স্ট্রিং রয়েছে একটি লা

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

আমার প্রশ্নটি হল: আমাজন এস 3 এ এই তথ্যটি "স্ট্রিম" / আপলোড এবং সেখানে একটি আসল চিত্র তৈরি করার আমার পরবর্তী পদক্ষেপগুলি কী?

নক্স https://github.com/LearnBoost/knox S3- তে কিছু রাখার জন্য একটি বিস্ময়কর মতলব বলে মনে হচ্ছে তবে আমি কী অনুপস্থিত তা কি বেস 64-এনকোডড-চিত্র-স্ট্রিং এবং প্রকৃত আপলোড ক্রিয়াকলাপের মধ্যে আঠালো ?

কোন ধারণা, পয়েন্টার এবং প্রতিক্রিয়া স্বাগত।


4
: এই উত্তর চেক stackoverflow.com/questions/5867534/...
akirk

উত্তর:


218

এখনও এই সমস্যা নিয়ে লড়াই করা লোকদের জন্য। নেটিভ অ্যাডস-এসডিকে নিয়ে আমি যে পদ্ধতিটি ব্যবহার করেছি তা এখানে:

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('successfully uploaded the image!');
      }
  });

s3_config.json ফাইল:

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

4
[নিখোঁজ প্রয়োজনীয় প্যারামিটার: প্যারামে প্রয়োজনীয় কী 'কী' অনুপস্থিত]
নিকোল এ। মাইলার

4
কী: req.body.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?অর্থ, আমি কি এই জাতীয় একটি দূষিত ফাইল পাব? আগাম ধন্যবাদ!
alexventuraio

4
@ মার্কলারের অবস্থানের পথটি মূলত মূল - যেমন আপনার বালতির নাম যদি - বালতি এবং কী নাম xyz.png হয়, তবে ফাইলের পথটি বালতি
দিব্যাংশু দাস

4
@ ডিভায়ানশু এই দুর্দান্ত উত্তরের জন্য ধন্যবাদ! এটা আমাকে অনেক সাহায্য করেছে। তবে আমি মনে করি 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)

4
বাফার অবজেক্ট একটি ত্রুটি ফেলবে "বাফার ডিফাইন না" আপনি কি আমাকে এর জন্য সমাধান দিতে পারবেন?
নবীনজি

আমিও একই ত্রুটি পাচ্ছি। আপনি কোনও সমাধান পেয়েছেন বা না পেয়েছেন
কৃষ্ণ

4
@ নবীনজি এটি একটি নোড উদাহরণ, সম্ভবত আপনি প্লেইন জেএস ব্যবহার করছেন?
পয়েন্টি

9

নীচে পোস্ট করে আমি যে নিবন্ধটি এসেছি তার কোডটি এখানে:

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-6c1bd945420f


4

গৃহীত উত্তরটি দুর্দান্ত কাজ করে তবে কাউকে যদি কেবল চিত্রের পরিবর্তে যে কোনও ফাইল গ্রহণ করতে হয় তবে এই রিজেক্সএক্স দুর্দান্ত কাজ করে:

/^data:.+;base64,/

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.