亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 AdonisJS 5 的文件存儲 (S3)

使用 AdonisJS 5 的文件存儲 (S3)

躍然一笑 2022-12-29 15:51:35
在 AdonisJS v4 文檔中,我們有這一部分解釋如何將文件流式傳輸到 S3 存儲桶。我在 AdonisJS v5 文檔中尋找類似的東西,但它只是一個如何將文件上傳到本地服務器的示例。如果它還沒有準備好,因為 Adonis 5 不是它的最新版本,這是通過 Adonis v5(特別是打字稿)將文件上傳到 S3 的另一種方式?
查看完整描述

3 回答

?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

我找到了一種使用 aws-sdk 執行此操作的方法,此代碼并非 100% 我的代碼:


uploadToS3Bucket功能:


import * as AWS from "aws-sdk";

import { v4 as uuid } from "uuid";



const s3 = new AWS.S3({

  region: process.env.AWS_REGION,

  secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,

  accessKeyId: process.env.AWS_ACCESS_KEY_ID,

});


export const uploadToS3Bucket = async (

  file: any,

  bucket: string

): Promise<{ key: string; url: string }> => {

  try {

    const { type, subtype, extname } = file;

    let mimeType = type + "/" + subtype;


    let fileType = "image/jpg";


    const name = uuid() + "." + extname;


    let buffer = Buffer.from(JSON.stringify(file), "utf-8");


    await s3

      .putObject({

        Key: name,

        Bucket: bucket,

        ContentType: fileType,

        Body: buffer.toString("base64"),

        ACL: "public-read",

      })

      .promise();


    let url = `https://${bucket}.s3.amazonaws.com/${name}`;

    console.log(url);

    return {

      key: name,

      url,

    };

  } catch (err) {

    console.log(err);

    return err;

  }

};

在控制器中:


public async store({ request }: HttpContextContract) {

  let file = getFileFromRequest(request, "defined_file_prop_name_here");


  if (file) {

    await uploadToS3Bucket(file, BUCKET_NAME);

  }

}


查看完整回答
反對 回復 2022-12-29
?
慕俠2389804

TA貢獻1719條經驗 獲得超6個贊

Adonis 4 使用flydrive來實現 s3 存儲,您也可以使用它來簡化和節省時間。使用 flydrive 配置和實例化后非常簡單

// Supported drivers: "local", "s3", "gcs"
await storage.disk('s3').put('testfile.txt', 'filecontents');


查看完整回答
反對 回復 2022-12-29
?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

您可以在沒有 ACL 權限問題的情況下使用它


不要忘記安裝 S3 驅動器:https ://docs.adonisjs.com/guides/drive


多個圖像的示例:


import Route from '@ioc:Adonis/Core/Route'

import Drive from '@ioc:Adonis/Core/Drive'

import fs from 'fs'

import path from 'path'

import { string } from '@ioc:Adonis/Core/Helpers'


Route.post('upload', async ({ request }) => {


   const images = request.files('images')

   for (let image of images) {

      if (image !== null) {

         const slugFileName = string.camelCase(path.parse(image.clientName).name).toLowerCase();


         const fileName = `${slugFileName}.${image.extname}`

         const fileStream = fs.createReadStream(image.tmpPath!)


         await Drive.putStream(fileName, fileStream, {

            contentType: image.headers['content-type']

         })

      }

   }

})

如果要上傳單張圖片:


Route.post('upload', async ({ request }) => {


   const image = request.file('image')

      if (image !== null) {

         const slugFileName = string.camelCase(path.parse(image.clientName).name).toLowerCase();


         const fileName = `${slugFileName}.${image.extname}`

         const fileStream = fs.createReadStream(image.tmpPath!)


         await Drive.putStream(fileName, fileStream, {

            contentType: image.headers['content-type']

         })

      }

})


查看完整回答
反對 回復 2022-12-29
  • 3 回答
  • 0 關注
  • 125 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號