Pular para o conteúdo principal
Versão: Em desenvolvimento — v0.2.3

Storage

O pacote storage seleciona o provedor a partir de CLOUD:

  • aws: Amazon S3;
  • gcp ou firebase: 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.Reader gené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.