Я пытаюсь загрузить изображение в S3-совместимое хранилище из Stackpath. Я использую Koa и Typescript. Я нашел пример на среде. Я обнаружил несколько проблем, я не уверен, как объявить тип ключа, URL и fileName, filePath и fileType. Также переменная конечная точка не может быть назначена свойству типа string.
Ошибка: TS2345 Аргумент типа конечной точки '{endpoint: Endpoint;accessKeyId: string;} 'нельзя назначить параметру типа' ClientConfiguration '.
Я игнорировал эти проблемы с @ ts-ignore, но хотел бы их исправить. Даже когда я игнорирую эту проблему, чтобы дать коду попробовать и отправить изображение с почтальоном, file.name и т. Д. Не определены.
import fs from 'fs'
import { BaseContext } from 'koa'
import aws from 'aws-sdk'
const accessKeyId = '***********************'
const secretAccessKey = '*************************'
const bucketName = 'img-example'
const endpoint = new aws.Endpoint('s3.eu-central.stackpathstorage.com')
export async function upload(ctx: BaseContext) {
const file = ctx.request.files.file
const { key, url } = await _upload({
fileName: file.name,
filePath: file.path,
fileType: file.type
})
ctx.body = { key, url }
}
function _upload({ fileName, filePath, fileType }) {
return new Promise((resolve, reject) => {
const s3 = new aws.S3({
endpoint,
accessKeyId,
secretAccessKey
})
const stream = fs.createReadStream(filePath)
stream.on('error', function(err) {
reject(err)
})
s3.upload(
{
ACL: 'public-read',
// You'll input your bucket name here
Bucket: bucketName,
Body: stream,
Key: fileName,
ContentType: fileType
},
function(err: any, data: { Key: any; Location: any }) {
if (err) {
reject(err)
} else if (data) {
resolve({ key: data.Key, url: data.Location })
}
}
)
})
}