Загрузка файлов с помощью Koa и Typescript в хранилище, совместимое с S3 - PullRequest
0 голосов
/ 02 ноября 2019

Я пытаюсь загрузить изображение в 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 })
        }
      }
    )
  })
}

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Проблема была в том, что я использовал коа-боди. Коа Малдер исправил мою проблему. Просто используйте Koa Mulder в качестве промежуточного программного обеспечения, если вы используете form-data.

0 голосов
/ 02 ноября 2019

Если вы используете s3 из aws-sdk, имя сегмента должно быть включено в переменную s3.

Пример javascript:

const accessKeyId = '***********************'
const secretAccessKey = '*************************'
const bucketName = 'img-example'

const s3 = new AWS.S3({
  accessKeyId,
  secretAccessKey
  params: { Bucket: bucketName }
});

См .:

Вот Документ AWS

...