Skip to content

Commit

Permalink
因秒传文件接口不支持20GB以上的文件, fixmd5, export 功能, 增加了文件大小检查
Browse files Browse the repository at this point in the history
  • Loading branch information
iikira committed Nov 18, 2018
1 parent 77fda04 commit 8e94e8c
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 8 deletions.
9 changes: 7 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -429,9 +429,9 @@ BaiduPCS-Go locate <文件1> <文件2> ...

#### 注意

若该功能无法正常使用, 提示`user is not authorized, hitcode:101`, 尝试更换 User-Agent 为 `netdisk`:
若该功能无法正常使用, 提示`user is not authorized, hitcode:101`, 尝试更换 User-Agent 为 `netdisk;8.3.1;android-android`:
```
BaiduPCS-Go config set -user_agent "netdisk"
BaiduPCS-Go config set -user_agent "netdisk;8.3.1;android-android"
```

## 手动秒传文件
Expand All @@ -446,6 +446,8 @@ BaiduPCS-Go ru -length=<文件的大小> -md5=<文件的md5值> -slicemd5=<文

遇到同名文件将会自动覆盖!

可能无法秒传 20GB 以上的文件!!

#### 例子:
```
# 如果秒传成功, 则保存到网盘路径 /test
Expand All @@ -470,6 +472,7 @@ BaiduPCS-Go fixmd5 <文件1> <文件2> <文件3> ...

修复文件MD5的原理为秒传文件, 即修复文件MD5成功后, 文件的**创建日期, 修改日期, fs_id, 版本历史等信息**将会被覆盖, 修复的MD5值将覆盖原先的MD5值, 但不影响文件的完整性.

注意: 无法修复 **20GB** 以上文件的 md5!!

#### 例子:
```
Expand Down Expand Up @@ -501,6 +504,8 @@ BaiduPCS-Go ep <文件/目录1> <文件/目录2> ...

#### 注意

**无法导出 20GB 以上的文件!!**

**无法导出文件的版本历史等数据!!**

并不是所有的文件都能导出成功, 程序会列出无法导出的文件列表
Expand Down
2 changes: 2 additions & 0 deletions baidupcs/baidupcs.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ const (
// OperationRecycleClear 清空回收站
OperationRecycleClear = "清空回收站"

// OperationExportFileInfo 导出文件信息
OperationExportFileInfo = "导出文件信息"
// OperationGetRapidUploadInfo 获取文件秒传信息
OperationGetRapidUploadInfo = "获取文件秒传信息"
// OperationFixMD5 修复文件md5
Expand Down
20 changes: 20 additions & 0 deletions baidupcs/extends.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"encoding/hex"
"errors"
"github.com/iikira/BaiduPCS-Go/baidupcs/pcserror"
"github.com/iikira/BaiduPCS-Go/pcsutil/converter"
"github.com/iikira/BaiduPCS-Go/pcsutil/escaper"
"github.com/iikira/BaiduPCS-Go/requester/downloader"
"io"
Expand Down Expand Up @@ -39,6 +40,8 @@ var (
ErrGetRapidUploadInfoMD5NotEqual = errors.New("Content-MD5 不匹配")
ErrGetRapidUploadInfoCrc32NotEqual = errors.New("x-bs-meta-crc32 不匹配")
ErrGetRapidUploadInfoSliceMD5NotEqual = errors.New("slice-md5 不匹配")

ErrFileTooLarge = errors.New("文件大于20GB, 无法秒传")
)

func (pcs *BaiduPCS) getLocateDownloadLink(pcspath string) (link string, pcsError pcserror.Error) {
Expand All @@ -58,6 +61,18 @@ func (pcs *BaiduPCS) getLocateDownloadLink(pcspath string) (link string, pcsErro
return u.String(), nil
}

// ExportByFileInfo 通过文件信息对象, 导出文件信息
func (pcs *BaiduPCS) ExportByFileInfo(finfo *FileDirectory) (rinfo *RapidUploadInfo, pcsError pcserror.Error) {
errInfo := pcserror.NewPCSErrorInfo(OperationExportFileInfo)
errInfo.ErrType = pcserror.ErrTypeOthers
if finfo.Size > 20*converter.GB {
errInfo.Err = ErrFileTooLarge
return nil, errInfo
}

return pcs.GetRapidUploadInfoByFileInfo(finfo)
}

// GetRapidUploadInfoByFileInfo 通过文件信息对象, 获取秒传信息
func (pcs *BaiduPCS) GetRapidUploadInfoByFileInfo(finfo *FileDirectory) (rinfo *RapidUploadInfo, pcsError pcserror.Error) {
if finfo.Size <= SliceMD5Size && len(finfo.BlockList) == 1 && finfo.BlockList[0] == finfo.MD5 {
Expand Down Expand Up @@ -237,6 +252,11 @@ func (pcs *BaiduPCS) FixMD5ByFileInfo(finfo *FileDirectory) (pcsError pcserror.E
return errInfo
}

if finfo.Size > 20*converter.GB { // 文件大于20GB
errInfo.Err = ErrFileTooLarge
return errInfo
}

// 忽略目录
if finfo.Isdir {
errInfo.Err = ErrFixMD5Isdir
Expand Down
16 changes: 10 additions & 6 deletions internal/pcscommand/export.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,19 +39,23 @@ func (task *etask) handleExportTaskError(l *list.List, failedList *list.List) {
// 不重试
switch task.err.GetError() {
case baidupcs.ErrGetRapidUploadInfoMD5NotFound, baidupcs.ErrGetRapidUploadInfoCrc32NotFound:
fmt.Printf("[%d] 导出失败, 可能是服务器未刷新文件的md5, 请过一段时间再试一试\n", task.ID)
fmt.Printf("[%d] - [%s] 导出失败, 可能是服务器未刷新文件的md5, 请过一段时间再试一试\n", task.ID, task.path)
failedList.PushBack(task)
return
case baidupcs.ErrFileTooLarge:
fmt.Printf("[%d] - [%s] 导出失败, 文件大于20GB, 无法导出\n", task.ID, task.path)
failedList.PushBack(task)
return
}

// 未达到失败重试最大次数, 将任务推送到队列末尾
if task.retry < task.MaxRetry {
task.retry++
fmt.Printf("[%d] 导出错误, %s, 重试 %d/%d\n", task.ID, task.err, task.retry, task.MaxRetry)
fmt.Printf("[%d] - [%s] 导出错误, %s, 重试 %d/%d\n", task.ID, task.path, task.err, task.retry, task.MaxRetry)
l.PushBack(task)
time.Sleep(3 * time.Duration(task.retry) * time.Second)
} else {
fmt.Printf("[%d] 导出错误, %s\n", task.ID, task.err)
fmt.Printf("[%d] - [%s] 导出错误, %s\n", task.ID, task.path, task.err)
failedList.PushBack(task)
}
}
Expand Down Expand Up @@ -159,7 +163,7 @@ func RunExport(pcspaths []string, opt *ExportOptions) {
fmt.Printf("写入文件失败: %s\n", writeErr)
return // 直接返回
}
fmt.Printf("[%d] 导出成功: %s\n", task.ID, task.path)
fmt.Printf("[%d] - [%s] 导出成功\n", task.ID, task.path)
continue
}

Expand All @@ -180,7 +184,7 @@ func RunExport(pcspaths []string, opt *ExportOptions) {
continue
}

rinfo, pcsError := pcs.GetRapidUploadInfoByFileInfo(task.fd)
rinfo, pcsError := pcs.ExportByFileInfo(task.fd)
if pcsError != nil {
task.err = pcsError
task.handleExportTaskError(l, failedList)
Expand All @@ -193,7 +197,7 @@ func RunExport(pcspaths []string, opt *ExportOptions) {
return // 直接返回
}

fmt.Printf("[%d] 导出成功: %s\n", task.ID, task.path)
fmt.Printf("[%d] - [%s] 导出成功\n", task.ID, task.path)
}

if failedList.Len() > 0 {
Expand Down
5 changes: 5 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -1240,6 +1240,8 @@ func main() {
上传的文件将会保存到网盘的目标目录.
遇到同名文件将会自动覆盖!
可能无法秒传 20GB 以上的文件!!
示例:
1. 如果秒传成功, 则保存到网盘路径 /test
Expand Down Expand Up @@ -1322,6 +1324,8 @@ func main() {
修复文件MD5不一定能成功, 原因可能是服务器未刷新, 可过几天后再尝试.
修复文件MD5的原理为秒传文件, 即修复文件MD5成功后, 文件的创建日期, 修改日期, fs_id, 版本历史等信息将会被覆盖, 修复的MD5值将覆盖原先的MD5值, 但不影响文件的完整性.
注意: 无法修复 20GB 以上文件的 md5!!
示例:
1. 修复 /我的资源/1.mp4 的 MD5 值
Expand Down Expand Up @@ -1461,6 +1465,7 @@ func main() {
导出网盘内的文件或目录, 原理为秒传文件, 此操作会生成导出文件或目录的命令.
注意!!! :
无法导出 20GB 以上的文件!!
无法导出文件的版本历史等数据!!
并不是所有的文件都能导出成功, 程序会列出无法导出的文件列表.
Expand Down

0 comments on commit 8e94e8c

Please sign in to comment.