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

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

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