Я настроил 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? Спасибо за вашу помощь!