You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

object.go 1.8 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package http
  2. import (
  3. "io"
  4. "net/http"
  5. "github.com/gin-gonic/gin"
  6. "gitlink.org.cn/cloudream/common/consts/errorcode"
  7. "gitlink.org.cn/cloudream/common/pkgs/logger"
  8. myio "gitlink.org.cn/cloudream/common/utils/io"
  9. )
  10. type ObjectService struct {
  11. *Server
  12. }
  13. func (s *Server) ObjectSvc() *ObjectService {
  14. return &ObjectService{
  15. Server: s,
  16. }
  17. }
  18. type ObjectDownloadReq struct {
  19. UserID *int64 `form:"userID" binding:"required"`
  20. ObjectID *int64 `form:"objectID" binding:"required"`
  21. }
  22. func (s *ObjectService) Download(ctx *gin.Context) {
  23. log := logger.WithField("HTTP", "Object.Download")
  24. var req ObjectDownloadReq
  25. if err := ctx.ShouldBindQuery(&req); err != nil {
  26. log.Warnf("binding body: %s", err.Error())
  27. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  28. return
  29. }
  30. file, err := s.svc.ObjectSvc().Download(*req.UserID, *req.ObjectID)
  31. if err != nil {
  32. log.Warnf("downloading object: %s", err.Error())
  33. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "download object failed"))
  34. return
  35. }
  36. ctx.Writer.WriteHeader(http.StatusOK)
  37. // TODO 需要设置FileName
  38. ctx.Header("Content-Disposition", "attachment; filename=filename")
  39. ctx.Header("Content-Type", "application/octet-stream")
  40. buf := make([]byte, 4096)
  41. ctx.Stream(func(w io.Writer) bool {
  42. rd, err := file.Read(buf)
  43. if err == io.EOF {
  44. err = myio.WriteAll(w, buf[:rd])
  45. if err != nil {
  46. log.Warnf("writing data to response: %s", err.Error())
  47. }
  48. return false
  49. }
  50. if err != nil {
  51. log.Warnf("reading file data: %s", err.Error())
  52. return false
  53. }
  54. err = myio.WriteAll(w, buf[:rd])
  55. if err != nil {
  56. log.Warnf("writing data to response: %s", err.Error())
  57. return false
  58. }
  59. return true
  60. })
  61. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。