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);
}
}

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']
})
}
})
添加回答
舉報