اذهب إلى المحتوى
  • 0

كيفية رفع الصور على استضافة aws لمشروع node & react

Ahmed Zehry

السؤال

Recommended Posts

  • 0

يجب اولا انشاء New bucket جديد على amazon s3 و الحصول على ACCESS_KEY_ID و SECRET_ACCESS_KEY لاستخدامهم فى مشروع الواجهة الخلفية .

الان نذهب الى مشروع nodejs ونقوم بتثبيت هذه المكتبات .

npm install @aws-sdk/client-s3 multer multer-s3

والان فى ملف app.js نقوم باضافة الاسطر التالية .

const multer = require('multer');
const multerS3 = require('multer-s3');
const { S3Client } = require('@aws-sdk/client-s3');

const s3Client = new S3Client({
  region: 'us-east-1', // هنا نقوم باضافة المنطفة التى قمنا بختيارها وقت انشاء bucket
  credentials: {
    accessKeyId: 'YOUR_ACCESS_KEY_ID', // هنا نقوم بكتابة key id الخاص بال bucket الذى انشأناه
    secretAccessKey: 'YOUR_SECRET_ACCESS_KEY',// هنا نقوم بكتابة secret key الخاص بال bucket الذى انشأناه
  },
});

const upload = multer({
  storage: multerS3({
    s3: s3Client,
    bucket: 's3-bucket-name', // هنا نقوم بكتابة اسم ال bucket
    acl: 'public-read', //هنا نقوم بجعل الملف مرئى للجميع 
    key: function (req, file, cb) {
      cb(null, Date.now().toString() + '-' + file.originalname); // هنا نقوم باضافة رقم مميز لاسم الصورة حتى لا يحدث مشاكل اذا كانت توجد صورة بنفس الاسم
    },
  }),
});

app.post('/upload', upload.single('image'), (req, res) => {
  let image_url = req.files[0].location;
  res.json({ message: 'Image uploaded successfully', "url":image_url });
});

ستلاحظ هنا فى هذا السطر let image_url = req.files[0].location فانه بعد رفع الملف بنجاح فانه يقوم بتعديل المصفوفة الخاصة بالملفات واضافة ال location الذى تم رفع الصورة فيه على aws . ولاحظ انه يقوم بارجاعه على هيئة مصفوفة لذلك استخدمنا [0] .

وبعد ذلك يمكنك استخدام  image_url وحفظه فى النموذج الخاص به فى mongodb وسوف يتم الحفظ على هيئة سلسلة نصية تحوى عنوان الصورة .

والان فى مشروع react نضع ال form كالتالى .

<form action="/upload-image" method="POST" enctype="multipart/form-data">
    <input type="file" name="image">
    <button type="submit">Upload</button>
  </form>

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

مرحبا 

عند رفع الصور يتم استعمال الكود التالي :
 

const s3 = new S3Client({
  region: "me-south-1",
  credentials: {
    accessKeyId: process.env.AWS_ACCESS_KEY_ID as string,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY as string,
  },
});
//___________________________

import { PutObjectCommand } from "@aws-sdk/client-s3";
import generateUniqueId from "../date_id";

export default async function handleUploadFilesS3({
  buffer,
  filename,

}: {
  buffer: any;
  filename: string;
 
}) {
  try {
    let newFileName = `${generateUniqueId()}_${filename.replaceAll(
      " ",
      "_"
    )}`;
    let command = new PutObjectCommand({
      Bucket: process.env.AWS_S3_BUCKET_NAME as string,
      Key: newFileName,
      Body: buffer,
    });
    await s3.send(command);
    return { name: newFileName, ok: true };
  } catch (error) {
    console.log(error);
    return { error: error, ok: false };
  }
}

handleUploadFilesS3 هي دالة تأخذ بعض الarguments الخاصة بال file مثل الbuffer الخاص به و اسم الfile و تقوم بعمل id مميز له ثم رفعة 


_______________________________
لإسترجاع url لكل image (signed url)
و هو يكون url مؤقت و ليس دائم و يمكنك التحكم في مدتة 

يتم تخزين في الداتابيز اسم الصورة فقط و ليس الurl لان الurl يكون مؤقت 
و يتم استعمال اسم الصورة لإنشاء الsigned url كالتالي :
 

  const games = await prisma.game.findMany();
  games.forEach(async (game) => {
    try {
      let command = new GetObjectCommand({
        Bucket: process.env.AWS_S3_BUCKET_NAME,
        Key: game.gameImg as string,
      });
      const url = await getSignedUrl(s3, command, { expiresIn: 3600 * 24 });
      game.gameImg = url;
    } catch (err) {
      console.log(err);
    }
  });

 

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...