Files
filekeeper/handler/file/upload/upload.go

59 lines
1.5 KiB
Go

package uploadHandler
import (
"fmt"
"github.com/fossyy/filekeeper/app"
"io"
"net/http"
"strconv"
)
func POST(w http.ResponseWriter, r *http.Request) {
fileID := r.PathValue("id")
if err := r.ParseMultipartForm(32 << 20); err != nil {
w.WriteHeader(http.StatusInternalServerError)
app.Server.Logger.Error(err.Error())
return
}
file, err := app.Server.Service.GetFile(r.Context(), fileID)
if err != nil {
app.Server.Logger.Error("error getting upload info: " + err.Error())
w.WriteHeader(http.StatusInternalServerError)
return
}
rawIndex := r.FormValue("index")
index, err := strconv.Atoi(rawIndex)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
app.Server.Logger.Error(err.Error())
return
}
fileByte, _, err := r.FormFile("chunk")
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
app.Server.Logger.Error("error getting upload info: " + err.Error())
return
}
defer fileByte.Close()
buffer, err := io.ReadAll(fileByte)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
app.Server.Logger.Error("error copying byte to file dst: " + err.Error())
return
}
err = app.Server.Storage.Add(r.Context(), fmt.Sprintf("%s/%s/chunk_%d", file.OwnerID.String(), file.ID.String(), index), buffer)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
app.Server.Logger.Error("error copying byte to file dst: " + err.Error())
return
}
app.Server.Service.UpdateFileChunk(r.Context(), file.ID, file.OwnerID, rawIndex, file.TotalChunk)
w.WriteHeader(http.StatusAccepted)
return
}