Modify: close file in main routine

pull/247/head
HFO4 5 years ago
parent d0bb123e03
commit 18968458a4

@ -0,0 +1 @@
package filesystem

@ -93,7 +93,6 @@ func (fs *FileSystem) GetContent(ctx context.Context, path string) (io.ReadSeeke
// 将当前存储策略重设为文件使用的 // 将当前存储策略重设为文件使用的
fs.Policy = fs.FileTarget[0].GetPolicy() fs.Policy = fs.FileTarget[0].GetPolicy()
err = fs.dispatchHandler() err = fs.dispatchHandler()
defer fs.CleanTargets()
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -75,6 +75,7 @@ func TestFileSystem_GetContent(t *testing.T) {
rs, err := fs.GetContent(ctx, "not exist file") rs, err := fs.GetContent(ctx, "not exist file")
asserts.Equal(ErrObjectNotExist, err) asserts.Equal(ErrObjectNotExist, err)
asserts.Nil(rs) asserts.Nil(rs)
fs.CleanTargets()
// 未知存储策略 // 未知存储策略
file, err := os.Create("TestFileSystem_GetContent.txt") file, err := os.Create("TestFileSystem_GetContent.txt")
@ -90,6 +91,7 @@ func TestFileSystem_GetContent(t *testing.T) {
rs, err = fs.GetContent(ctx, "/TestFileSystem_GetContent.txt") rs, err = fs.GetContent(ctx, "/TestFileSystem_GetContent.txt")
asserts.Error(err) asserts.Error(err)
asserts.NoError(mock.ExpectationsWereMet()) asserts.NoError(mock.ExpectationsWereMet())
fs.CleanTargets()
// 打开文件失败 // 打开文件失败
mock.ExpectQuery("SELECT(.+)"). mock.ExpectQuery("SELECT(.+)").
@ -101,6 +103,7 @@ func TestFileSystem_GetContent(t *testing.T) {
rs, err = fs.GetContent(ctx, "/TestFileSystem_GetContent.txt") rs, err = fs.GetContent(ctx, "/TestFileSystem_GetContent.txt")
asserts.Equal(serializer.CodeIOFailed, err.(serializer.AppError).Code) asserts.Equal(serializer.CodeIOFailed, err.(serializer.AppError).Code)
asserts.NoError(mock.ExpectationsWereMet()) asserts.NoError(mock.ExpectationsWereMet())
fs.CleanTargets()
// 打开成功 // 打开成功
mock.ExpectQuery("SELECT(.+)"). mock.ExpectQuery("SELECT(.+)").

@ -32,12 +32,13 @@ func (handler Handler) Get(ctx context.Context, path string) (io.ReadSeeker, err
} }
// 开启一个协程用于请求结束后关闭reader // 开启一个协程用于请求结束后关闭reader
go closeReader(ctx, file) // go closeReader(ctx, file)
return file, nil return file, nil
} }
// closeReader 用于在请求结束后关闭reader // closeReader 用于在请求结束后关闭reader
// TODO 让业务代码自己关闭
func closeReader(ctx context.Context, closer io.Closer) { func closeReader(ctx context.Context, closer io.Closer) {
select { select {
case <-ctx.Done(): case <-ctx.Done():

@ -35,9 +35,11 @@ type policy struct {
} }
type group struct { type group struct {
AllowShare bool `json:"allowShare"` ID uint `json:"id"`
AllowRemoteDownload bool `json:"allowRemoteDownload"` Name string `json:"name"`
AllowTorrentDownload bool `json:"allowTorrentDownload"` AllowShare bool `json:"allowShare"`
AllowRemoteDownload bool `json:"allowRemoteDownload"`
AllowTorrentDownload bool `json:"allowTorrentDownload"`
} }
type storage struct { type storage struct {
@ -65,6 +67,8 @@ func BuildUser(user model.User) User {
AllowGetSource: user.Policy.IsOriginLinkEnable, AllowGetSource: user.Policy.IsOriginLinkEnable,
}, },
Group: group{ Group: group{
ID: user.GroupID,
Name: user.Group.Name,
AllowShare: user.Group.ShareEnabled, AllowShare: user.Group.ShareEnabled,
AllowRemoteDownload: aria2Option[0], AllowRemoteDownload: aria2Option[0],
AllowTorrentDownload: aria2Option[2], AllowTorrentDownload: aria2Option[2],

@ -11,6 +11,7 @@ import (
"github.com/HFO4/cloudreve/pkg/util" "github.com/HFO4/cloudreve/pkg/util"
"github.com/HFO4/cloudreve/service/explorer" "github.com/HFO4/cloudreve/service/explorer"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"io"
"net/http" "net/http"
"net/url" "net/url"
"strconv" "strconv"
@ -99,6 +100,11 @@ func Thumb(c *gin.Context) {
} }
http.ServeContent(c.Writer, c.Request, "thumb.png", fs.FileTarget[0].UpdatedAt, resp.Content) http.ServeContent(c.Writer, c.Request, "thumb.png", fs.FileTarget[0].UpdatedAt, resp.Content)
// 检查是否需要关闭文件
if fc, ok := resp.Content.(io.Closer); ok {
defer fc.Close()
}
} }
// Download 文件下载 // Download 文件下载

@ -6,6 +6,7 @@ import (
"github.com/HFO4/cloudreve/pkg/filesystem/fsctx" "github.com/HFO4/cloudreve/pkg/filesystem/fsctx"
"github.com/HFO4/cloudreve/pkg/serializer" "github.com/HFO4/cloudreve/pkg/serializer"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"io"
"net/http" "net/http"
) )
@ -41,6 +42,11 @@ func (service *FileAnonymousGetService) Download(ctx context.Context, c *gin.Con
// 发送文件 // 发送文件
http.ServeContent(c.Writer, c.Request, service.Name, fs.FileTarget[0].UpdatedAt, rs) http.ServeContent(c.Writer, c.Request, service.Name, fs.FileTarget[0].UpdatedAt, rs)
// 检查是否需要关闭文件
if fc, ok := rs.(io.Closer); ok {
defer fc.Close()
}
return serializer.Response{ return serializer.Response{
Code: 0, Code: 0,
} }
@ -66,6 +72,11 @@ func (service *FileDownloadService) Download(ctx context.Context, c *gin.Context
// 发送文件 // 发送文件
http.ServeContent(c.Writer, c.Request, "", fs.FileTarget[0].UpdatedAt, rs) http.ServeContent(c.Writer, c.Request, "", fs.FileTarget[0].UpdatedAt, rs)
// 检查是否需要关闭文件
if fc, ok := rs.(io.Closer); ok {
defer fc.Close()
}
return serializer.Response{ return serializer.Response{
Code: 0, Code: 0,
} }

Loading…
Cancel
Save