TIL 25 | S3


S3
アマゾンS 3は、アマゾンWebサービスが提供するオンラインストレージWebサービスである
S 3設定
パブリックアクセスの許可
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucketname/*"
        }
    ]
}
Django
s3.py
クラスでinitジェネレータを使用してクライアントを保存する
クライアントは、Amazonサービス、アクセスキー値、アクセスIDをオブジェクトに格納します.
ファイルをs 3にアップロードするにはupload fileobj関数を使用します.
この関数は、ファイルとファイル名、フォルダ名(パス)、ファイルタイプなどを格納できます.
ファイルのurlをDBに保存すると、そのファイルを後続処理できます
キー値を使用したファイルの変更
urlを使用してファイルをクライアントに渡してロードできます.
from my_settings import AWS_STORAGE_BUCKET_NAME, AWS_S3_CUSTOM_DOMAIN

class S3Client:
    def __init__(self, s3_client):
        self.s3_client = s3_client

    def upload(self, file, file_name, FOLDER_NAME):
        self.s3_client.upload_fileobj(
            file,
            AWS_STORAGE_BUCKET_NAME,
            f"{FOLDER_NAME}/{file_name}",                
            ExtraArgs={"ContentType": file.content_type}
       ) 
        file_urls = f"https://{AWS_S3_CUSTOM_DOMAIN}/{FOLDER_NAME}/{file_name}"

        return file_urls
        
    def delete(self, file_name):
        self.s3_client.delete_object(
            Bucket=AWS_STORAGE_BUCKET_NAME, 
            Key=file_name)
view.py
boto 3を使ってs 3を使うことができます
プレイヤーが許可されたプレイヤーであるか否かを判断し、トークン内のプレイヤー情報をロードする
ファイル名uuid 4を使用して重複しないファイル名
import boto3
from uuid           import uuid4

client = boto3.client(
            's3',
            aws_access_key_id     = MY_AWS_ACCESS_KEY_ID,
            aws_secret_access_key = MY_AWS_SECRET_ACCESS_KEY  
            )

class ProfileUpload(View):
    @LoginRequired
    def post(self, request): 
        try:
            file   = request.FILES.get('profile_file')
            user   = request.user
            if not file:
                return JsonResponse({'massage':"none file"}, status=404)
            
            s3_client   = S3Client(client)
            file_name   = uuid4().hex
            FOLDER_NAME = "profile"
            file_urls   = s3_client.upload(file, file_name, FOLDER_NAME)

            user.profile_url = file_urls
            user.save()

            return JsonResponse({'massege':'create'}, status=200)
            
        except KeyError:
            return JsonResponse({"message" : "key error"}, status=400)
Node.JS
s3.js
Multierとmulter-s 3を使用してファイル転送のリクエストを受信できます.
aws-sdkでs 3を利用できます
uuidを使用してファイル名の重複を解消
パケット名、ファイルタイプ、キー値などをmulters 3に格納および転送する
cbはnextに似た関数です
メタデータとキー値を次のコールバック関数に渡す
const multer   = require("multer");
const multerS3 = require("multer-s3");
const aws      = require("aws-sdk");
const { v4 }   = require("uuid")

require('dotenv').config()

const BUCKET_NAME = process.env.BUCKET_NAME

const s3 = new aws.S3({
    accessKeyId: process.env.AMAZONE_ACCESS_KEY_ID,
    secretAccessKey: process.env.AMAZONE_SECRET_ACCESS_KEY,
    region: process.env.AMAZONE_REGION,
});

exports.upload = multer({
    storage: multerS3({
        s3: s3,
        bucket: BUCKET_NAME,
        contentType: multerS3.AUTO_CONTENT_TYPE,
        acl: "public-read",
        metadata: function (req, file, cb) {
            cb(null, { fieldName: file.fieldname });
        },
        key: function (req, file, cb) {
            cb(
                null,
                "profile/" + v4() + "." + file.originalname.split(".").pop()
            );
        },
    }),
});
view.js
s3.upload.singleミドルウェアによるファイルの受信
キー値を指定できます
const express = require("express");
const router = express.Router();
const s3 = require("./S3");

router.post(
    "/profile",
    s3.delete,
    s3.upload.single("profile"),
    Profile.uploadProfile
);

module.exports = router;