2026-03-12 23:49:16 +00:00
package file
2026-02-08 00:58:51 +00:00
import (
"bytes"
"fmt"
"io"
"mime/multipart"
"net/http"
"github.com/google/uuid"
"github.com/rs/zerolog/log"
)
2026-03-27 08:39:38 -07:00
type Upload struct {
2026-02-08 00:58:51 +00:00
ContentType string
2026-02-08 01:44:44 +00:00
Name string
SizeBytes int
UUID uuid . UUID
2026-02-08 00:58:51 +00:00
}
2026-03-27 08:39:38 -07:00
func SaveFileUploads ( r * http . Request , collection Collection ) ( [ ] Upload , error ) {
results := make ( [ ] Upload , 0 )
2026-02-08 00:58:51 +00:00
for n , fheaders := range r . MultipartForm . File {
log . Debug ( ) . Str ( "n" , n ) . Msg ( "looking at header" )
for _ , headers := range fheaders {
2026-02-08 04:36:12 +00:00
f , err := saveFileUpload ( headers , collection )
2026-02-08 00:58:51 +00:00
if err != nil {
return results , fmt . Errorf ( "Failed to extract photo upload: %w" , err )
}
results = append ( results , f )
}
}
return results , nil
}
2026-03-27 08:39:38 -07:00
func saveFileUploads ( r * http . Request , collection Collection ) ( [ ] Upload , error ) {
results := make ( [ ] Upload , 0 )
2026-02-08 00:58:51 +00:00
for name , fheaders := range r . MultipartForm . File {
for _ , headers := range fheaders {
2026-02-08 04:36:12 +00:00
upload , err := saveFileUpload ( headers , collection )
2026-02-08 00:58:51 +00:00
if err != nil {
return results , fmt . Errorf ( "Failed to save upload '%s': %w" , name , err )
}
results = append ( results , upload )
}
}
return results , nil
}
2026-03-27 08:39:38 -07:00
func saveFileUpload ( headers * multipart . FileHeader , collection Collection ) ( upload Upload , err error ) {
2026-02-08 00:58:51 +00:00
file , err := headers . Open ( )
if err != nil {
return upload , fmt . Errorf ( "Failed to open header: %w" , err )
}
defer file . Close ( )
file_bytes , err := io . ReadAll ( file )
content_type := http . DetectContentType ( file_bytes )
u , err := uuid . NewUUID ( )
if err != nil {
return upload , fmt . Errorf ( "Failed to create uuid" , err )
}
2026-02-08 04:36:12 +00:00
err = FileContentWrite ( bytes . NewReader ( file_bytes ) , collection , u )
2026-02-08 00:58:51 +00:00
if err != nil {
return upload , fmt . Errorf ( "Failed to write file to disk: %w" , err )
}
log . Info ( ) . Int ( "size" , len ( file_bytes ) ) . Str ( "uploaded_filename" , headers . Filename ) . Str ( "content-type" , content_type ) . Str ( "uuid" , u . String ( ) ) . Msg ( "Saved an uploaded file to disk" )
2026-03-27 08:39:38 -07:00
return Upload {
2026-02-08 01:44:44 +00:00
ContentType : content_type ,
Name : headers . Filename ,
SizeBytes : len ( file_bytes ) ,
UUID : u ,
2026-02-08 00:58:51 +00:00
} , nil
}