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"
)
type FileUpload struct {
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-02-08 04:36:12 +00:00
func SaveFileUpload ( r * http . Request , name string , collection Collection ) ( [ ] FileUpload , error ) {
2026-02-08 00:58:51 +00:00
results := make ( [ ] FileUpload , 0 )
for n , fheaders := range r . MultipartForm . File {
log . Debug ( ) . Str ( "n" , n ) . Msg ( "looking at header" )
if n != name {
continue
}
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-02-08 04:36:12 +00:00
func saveFileUploads ( r * http . Request , collection Collection ) ( [ ] FileUpload , error ) {
2026-02-08 00:58:51 +00:00
results := make ( [ ] FileUpload , 0 )
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-02-08 04:36:12 +00:00
func saveFileUpload ( headers * multipart . FileHeader , collection Collection ) ( upload FileUpload , 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" )
return FileUpload {
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
}