Storage
O pacote storage seleciona o provedor a partir de CLOUD:
aws: Amazon S3;gcpoufirebase: Google Cloud Storage.
Inicializar
Configure credenciais usando o mecanismo padrão do provedor e inicialize depois de colibri.InitializeApp():
storage.Initialize()
CLOUD=none não cria um provedor de storage. Não chame as operações nesse modo.
Upload recebido por formulário
Na v0.2.2, UploadFile recebe *multipart.File. O arquivo pode vir diretamente de WebContext.FormFile:
func upload(ctx restserver.WebContext) {
file, header, err := ctx.FormFile("file")
if err != nil {
ctx.ErrorResponse(http.StatusBadRequest, err)
return
}
defer file.Close()
location, err := storage.UploadFile(
ctx.Context(),
"documents",
header.Filename,
&file,
)
if err != nil {
ctx.ErrorResponse(http.StatusBadGateway, err)
return
}
ctx.JsonResponse(http.StatusCreated, map[string]string{
"location": location,
})
}
Download
file, err := storage.DownloadFile(ctx, "documents", objectKey)
if err != nil {
return err
}
defer file.Close()
content, err := io.ReadAll(file)
O retorno é um arquivo temporário *os.File; feche-o sempre.
Remover
if err := storage.DeleteFile(ctx, "documents", objectKey); err != nil {
return fmt.Errorf("delete object: %w", err)
}
Limites
- A API de upload não aceita um
io.Readergenérico na v0.2.2. - O bucket deve existir e a identidade precisa de permissão para a operação.
- Não use nomes de arquivo fornecidos pelo cliente como chave sem normalização.
- Para arquivos grandes, processe o download por streaming em vez de usar
io.ReadAll.
Veja a implementação no school-module.