Как загрузить изображения из браузера в Amazon S3 с помощью Vapor и Leaf? - PullRequest
1 голос
/ 30 мая 2019

Я настроил AWS S3 bucket и могу загружать туда файлы, используя Vapor 3 и Postman (PUT -request и с заголовками: ["x-amz-acl": "public-read"]), но я хотел бы сделать это из браузера (я использую лист).

Так как я могу загрузить файлы изображений из браузера? Я новичок в HTML, AWS S3 и Vapor.

Я использую:

  • Пар 3
  • AWS S3
  • Листовая упаковка
  • S3 пакет
  • Пакет VaporExt

Я следовал этому руководству, чтобы настроить все (кроме запроса get и политик корзины): https://fivedottwelve.com/blog/using-amazon-s3-with-vapor/

Получить URL:

func preparePresignedUrl(request: Request) throws -> String {

    let baseUrl = awsConfig.url
    let imagePath = awsConfig.imagePath
    let newFilename = UUID().uuidString + ".png"


    guard var url = URL(string: baseUrl) else {
        throw Abort(.internalServerError)
    }
    url.appendPathComponent(imagePath)
    url.appendPathComponent(newFilename)

    let headers = ["x-amz-acl" : "public-read"]

    let s3 = try request.makeS3Signer()
    let result = try s3.presignedURL(for: .PUT, url: url, expiration: Expiration.hour, headers: headers)

    guard let presignedUrl = result?.absoluteString else {
        throw Abort(.internalServerError)
    }

    return presignedUrl
}

Обработчик маршрута:

func ImagesHandler(_ req: Request) throws -> Future<View> {

    let presignedUrl = try preparePresignedUrl(request: req)
    let context = PostImageContext(title: "Add Image", url: presignedUrl)
    return try req.view().render("addImage", context)
}

Контекст, содержащий данные для переменных Leaf:

struct PostImageContext: Encodable {
    let title : String
    let url : String
}

Файл листа (addImage.leaf):

#set("content") {

    <h1>#(title)</h1>

    <form method="PUT", action="#(url)", enctype="multipart/form-data">

    <div class="form-group">
    <label>
        Choose Image
    </label>
    <input type="file"
    class="form-control-file"/>
    </div>

    <button type="submit" class="btn btn-primary">
        Upload
    </button>   
    </form>
}

#embed("base")

И он возвращает ошибку:

"NoSuchKeyThe specified key does not exist"

Я узнал, что единственными допустимыми значениями для атрибута метода являются get и post, что означает, что это недопустимый HTML и будет обрабатываться так же, как, например, отправка запроса GET (объясняет полученную ошибку).

Как обойти это, используя Vapor? Спасибо за вашу помощь!

...