nidus-sync/public-report/photo-upload.go

65 lines
1.6 KiB
Go
Raw Normal View History

package publicreport
import (
"bytes"
"fmt"
"io"
"net/http"
"github.com/Gleipnir-Technology/nidus-sync/userfile"
"github.com/google/uuid"
"github.com/rs/zerolog/log"
)
type PhotoUpload struct {
Filename string
Size int64
UUID uuid.UUID
}
func extractPhotoUploads(r *http.Request) (uploads []PhotoUpload, err error) {
uploads = make([]PhotoUpload, 0)
for _, fheaders := range r.MultipartForm.File {
for _, headers := range fheaders {
file, err := headers.Open()
if err != nil {
return uploads, fmt.Errorf("Failed to open header: %v", err)
}
defer file.Close()
buff := make([]byte, 512)
file.Read(buff)
file.Seek(0, 0)
contentType := http.DetectContentType(buff)
var sizeBuff bytes.Buffer
fileSize, err := sizeBuff.ReadFrom(file)
if err != nil {
return uploads, fmt.Errorf("Failed to read file: %v", err)
}
file.Seek(0, 0)
contentBuf := bytes.NewBuffer(nil)
if _, err := io.Copy(contentBuf, file); err != nil {
return uploads, fmt.Errorf("Failed to save file: %v", err)
}
log.Info().Int64("size", fileSize).Str("filename", headers.Filename).Str("content-type", contentType).Msg("Got an uploaded file")
u, err := uuid.NewUUID()
if err != nil {
return uploads, fmt.Errorf("Failed to create quick report photo uuid", err)
}
err = userfile.PublicImageFileContentWrite(u, file)
if err != nil {
return uploads, fmt.Errorf("Failed to write image file to disk: %v", err)
}
uploads = append(uploads, PhotoUpload{
Size: fileSize,
Filename: headers.Filename,
UUID: u,
})
}
}
return uploads, nil
}