|
|
@ -43,7 +43,7 @@ func (handler Driver) List(ctx context.Context, path string, recursive bool) ([]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
util.Log().Warning("无法遍历目录 %s, %s", path, err)
|
|
|
|
util.Log().Warning("Failed to walk folder %q: %s", path, err)
|
|
|
|
return filepath.SkipDir
|
|
|
|
return filepath.SkipDir
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -78,7 +78,7 @@ func (handler Driver) Get(ctx context.Context, path string) (response.RSCloser,
|
|
|
|
// 打开文件
|
|
|
|
// 打开文件
|
|
|
|
file, err := os.Open(util.RelativePath(path))
|
|
|
|
file, err := os.Open(util.RelativePath(path))
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
util.Log().Debug("无法打开文件:%s", err)
|
|
|
|
util.Log().Debug("Failed to open file: %s", err)
|
|
|
|
return nil, err
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -94,8 +94,8 @@ func (handler Driver) Put(ctx context.Context, file fsctx.FileHeader) error {
|
|
|
|
// 如果非 Overwrite,则检查是否有重名冲突
|
|
|
|
// 如果非 Overwrite,则检查是否有重名冲突
|
|
|
|
if fileInfo.Mode&fsctx.Overwrite != fsctx.Overwrite {
|
|
|
|
if fileInfo.Mode&fsctx.Overwrite != fsctx.Overwrite {
|
|
|
|
if util.Exists(dst) {
|
|
|
|
if util.Exists(dst) {
|
|
|
|
util.Log().Warning("物理同名文件已存在或不可用: %s", dst)
|
|
|
|
util.Log().Warning("File with the same name existed or unavailable: %s", dst)
|
|
|
|
return errors.New("物理同名文件已存在或不可用")
|
|
|
|
return errors.New("file with the same name existed or unavailable")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -104,7 +104,7 @@ func (handler Driver) Put(ctx context.Context, file fsctx.FileHeader) error {
|
|
|
|
if !util.Exists(basePath) {
|
|
|
|
if !util.Exists(basePath) {
|
|
|
|
err := os.MkdirAll(basePath, Perm)
|
|
|
|
err := os.MkdirAll(basePath, Perm)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
util.Log().Warning("无法创建目录,%s", err)
|
|
|
|
util.Log().Warning("Failed to create directory: %s", err)
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -123,7 +123,7 @@ func (handler Driver) Put(ctx context.Context, file fsctx.FileHeader) error {
|
|
|
|
|
|
|
|
|
|
|
|
out, err = os.OpenFile(dst, openMode, Perm)
|
|
|
|
out, err = os.OpenFile(dst, openMode, Perm)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
util.Log().Warning("无法打开或创建文件,%s", err)
|
|
|
|
util.Log().Warning("Failed to open or create file: %s", err)
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
defer out.Close()
|
|
|
|
defer out.Close()
|
|
|
@ -131,22 +131,22 @@ func (handler Driver) Put(ctx context.Context, file fsctx.FileHeader) error {
|
|
|
|
if fileInfo.Mode&fsctx.Append == fsctx.Append {
|
|
|
|
if fileInfo.Mode&fsctx.Append == fsctx.Append {
|
|
|
|
stat, err := out.Stat()
|
|
|
|
stat, err := out.Stat()
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
util.Log().Warning("无法读取文件信息,%s", err)
|
|
|
|
util.Log().Warning("Failed to read file info: %s", err)
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if uint64(stat.Size()) < fileInfo.AppendStart {
|
|
|
|
if uint64(stat.Size()) < fileInfo.AppendStart {
|
|
|
|
return errors.New("未上传完成的文件分片与预期大小不一致")
|
|
|
|
return errors.New("size of unfinished uploaded chunks is not as expected")
|
|
|
|
} else if uint64(stat.Size()) > fileInfo.AppendStart {
|
|
|
|
} else if uint64(stat.Size()) > fileInfo.AppendStart {
|
|
|
|
out.Close()
|
|
|
|
out.Close()
|
|
|
|
if err := handler.Truncate(ctx, dst, fileInfo.AppendStart); err != nil {
|
|
|
|
if err := handler.Truncate(ctx, dst, fileInfo.AppendStart); err != nil {
|
|
|
|
return fmt.Errorf("覆盖分片时发生错误: %w", err)
|
|
|
|
return fmt.Errorf("failed to overwrite chunk: %w", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
out, err = os.OpenFile(dst, openMode, Perm)
|
|
|
|
out, err = os.OpenFile(dst, openMode, Perm)
|
|
|
|
defer out.Close()
|
|
|
|
defer out.Close()
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
util.Log().Warning("无法打开或创建文件,%s", err)
|
|
|
|
util.Log().Warning("Failed to create or open file: %s", err)
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -158,10 +158,10 @@ func (handler Driver) Put(ctx context.Context, file fsctx.FileHeader) error {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (handler Driver) Truncate(ctx context.Context, src string, size uint64) error {
|
|
|
|
func (handler Driver) Truncate(ctx context.Context, src string, size uint64) error {
|
|
|
|
util.Log().Warning("截断文件 [%s] 至 [%d]", src, size)
|
|
|
|
util.Log().Warning("Truncate file %q to [%d].", src, size)
|
|
|
|
out, err := os.OpenFile(src, os.O_WRONLY, Perm)
|
|
|
|
out, err := os.OpenFile(src, os.O_WRONLY, Perm)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
util.Log().Warning("无法打开文件,%s", err)
|
|
|
|
util.Log().Warning("Failed to open file: %s", err)
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -180,7 +180,7 @@ func (handler Driver) Delete(ctx context.Context, files []string) ([]string, err
|
|
|
|
if util.Exists(filePath) {
|
|
|
|
if util.Exists(filePath) {
|
|
|
|
err := os.Remove(filePath)
|
|
|
|
err := os.Remove(filePath)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
util.Log().Warning("无法删除文件,%s", err)
|
|
|
|
util.Log().Warning("Failed to delete file: %s", err)
|
|
|
|
retErr = err
|
|
|
|
retErr = err
|
|
|
|
deleteFailed = append(deleteFailed, value)
|
|
|
|
deleteFailed = append(deleteFailed, value)
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -217,7 +217,7 @@ func (handler Driver) Source(
|
|
|
|
) (string, error) {
|
|
|
|
) (string, error) {
|
|
|
|
file, ok := ctx.Value(fsctx.FileModelCtx).(model.File)
|
|
|
|
file, ok := ctx.Value(fsctx.FileModelCtx).(model.File)
|
|
|
|
if !ok {
|
|
|
|
if !ok {
|
|
|
|
return "", errors.New("无法获取文件记录上下文")
|
|
|
|
return "", errors.New("failed to read file model context")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 是否启用了CDN
|
|
|
|
// 是否启用了CDN
|
|
|
@ -238,7 +238,7 @@ func (handler Driver) Source(
|
|
|
|
downloadSessionID := util.RandStringRunes(16)
|
|
|
|
downloadSessionID := util.RandStringRunes(16)
|
|
|
|
err = cache.Set("download_"+downloadSessionID, file, int(ttl))
|
|
|
|
err = cache.Set("download_"+downloadSessionID, file, int(ttl))
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return "", serializer.NewError(serializer.CodeCacheOperation, "无法创建下载会话", err)
|
|
|
|
return "", serializer.NewError(serializer.CodeCacheOperation, "Failed to create download session", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 签名生成文件记录
|
|
|
|
// 签名生成文件记录
|
|
|
@ -257,7 +257,7 @@ func (handler Driver) Source(
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return "", serializer.NewError(serializer.CodeEncryptError, "无法对URL进行签名", err)
|
|
|
|
return "", serializer.NewError(serializer.CodeEncryptError, "Failed to sign url", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
finalURL := baseURL.ResolveReference(signedURI).String()
|
|
|
|
finalURL := baseURL.ResolveReference(signedURI).String()
|
|
|
|