diff --git a/server/resource.go b/server/resource.go index 5effee47..46a96404 100644 --- a/server/resource.go +++ b/server/resource.go @@ -15,7 +15,7 @@ func (s *Server) registerResourceRoutes(g *echo.Group) { g.POST("/resource", func(c echo.Context) error { userID := c.Get(getUserIDContextKey()).(int) - err := c.Request().ParseMultipartForm(5 << 20) + err := c.Request().ParseMultipartForm(64 << 20) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, "Upload file overload max size").SetInternal(err) } diff --git a/server/webhook.go b/server/webhook.go index e5319035..4e0ab50c 100644 --- a/server/webhook.go +++ b/server/webhook.go @@ -3,6 +3,7 @@ package server import ( "encoding/json" "fmt" + "io/ioutil" "memos/api" "net/http" "strconv" @@ -84,6 +85,64 @@ func (s *Server) registerWebhookRoutes(g *echo.Group) { return nil }) + g.POST("/:openId/resource", func(c echo.Context) error { + openID := c.Param("openId") + + userFind := &api.UserFind{ + OpenID: &openID, + } + user, err := s.UserService.FindUser(userFind) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to find user by open_id").SetInternal(err) + } + if user == nil { + return echo.NewHTTPError(http.StatusNotFound, fmt.Sprintf("User openId not found: %s", openID)) + } + + if err := c.Request().ParseMultipartForm(64 << 20); err != nil { + return echo.NewHTTPError(http.StatusBadRequest, "Upload file overload max size").SetInternal(err) + } + + file, err := c.FormFile("file") + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, "Upload file not found").SetInternal(err) + } + + filename := file.Filename + filetype := file.Header.Get("Content-Type") + size := file.Size + src, err := file.Open() + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to open file").SetInternal(err) + } + defer src.Close() + + fileBytes, err := ioutil.ReadAll(src) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to read file").SetInternal(err) + } + + resourceCreate := &api.ResourceCreate{ + Filename: filename, + Type: filetype, + Size: size, + Blob: fileBytes, + CreatorID: user.ID, + } + + resource, err := s.ResourceService.CreateResource(resourceCreate) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to create resource").SetInternal(err) + } + + c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8) + if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(resource)); err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to encode resource response").SetInternal(err) + } + + return nil + }) + g.GET("/r/:resourceId/:filename", func(c echo.Context) error { resourceID, err := strconv.Atoi(c.Param("resourceId")) if err != nil { diff --git a/web/src/services/resourceService.ts b/web/src/services/resourceService.ts index 28244aeb..3bf3622a 100644 --- a/web/src/services/resourceService.ts +++ b/web/src/services/resourceService.ts @@ -9,14 +9,12 @@ class ResourceService { public async upload(file: File) { const { name: filename, size } = file; - if (size > 5 << 20) { - return Promise.reject("overload max size: 5Mb"); + if (size > 64 << 20) { + return Promise.reject("overload max size: 8MB"); } const formData = new FormData(); - formData.append("file", file, filename); - const data = await api.uploadFile(formData); return data;