From cba77a47e4676a0531992604d523deb5bd51e837 Mon Sep 17 00:00:00 2001 From: jenfonro <799170122@qq.com> Date: Tue, 23 Sep 2025 00:17:59 +0800 Subject: [PATCH 1/3] fix file link display size --- drivers/google_drive/util.go | 39 ++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/drivers/google_drive/util.go b/drivers/google_drive/util.go index ff4bb7b9d..0a4c2daaa 100644 --- a/drivers/google_drive/util.go +++ b/drivers/google_drive/util.go @@ -249,11 +249,50 @@ func (d *GoogleDrive) getFiles(id string) ([]File, error) { return nil, err } pageToken = resp.NextPageToken + + // 处理快捷链接,获取目标文件的大小信息 + for i := range resp.Files { + if resp.Files[i].MimeType == "application/vnd.google-apps.shortcut" && resp.Files[i].ShortcutDetails.TargetId != "" { + // 获取目标文件的详细信息 + targetFile, err := d.getTargetFileInfo(resp.Files[i].ShortcutDetails.TargetId) + if err == nil && targetFile.Size != "" { + // 使用目标文件的大小信息 + resp.Files[i].Size = targetFile.Size + // 同时更新其他相关信息 + if targetFile.MD5Checksum != "" { + resp.Files[i].MD5Checksum = targetFile.MD5Checksum + } + if targetFile.SHA1Checksum != "" { + resp.Files[i].SHA1Checksum = targetFile.SHA1Checksum + } + if targetFile.SHA256Checksum != "" { + resp.Files[i].SHA256Checksum = targetFile.SHA256Checksum + } + } + } + } + res = append(res, resp.Files...) } return res, nil } +// getTargetFileInfo 获取目标文件的详细信息,用于快捷链接 +func (d *GoogleDrive) getTargetFileInfo(targetId string) (File, error) { + var targetFile File + url := fmt.Sprintf("https://www.googleapis.com/drive/v3/files/%s", targetId) + query := map[string]string{ + "fields": "id,name,mimeType,size,md5Checksum,sha1Checksum,sha256Checksum", + } + _, err := d.request(url, http.MethodGet, func(req *resty.Request) { + req.SetQueryParams(query) + }, &targetFile) + if err != nil { + return File{}, err + } + return targetFile, nil +} + func (d *GoogleDrive) chunkUpload(ctx context.Context, file model.FileStreamer, url string, up driver.UpdateProgress) error { var defaultChunkSize = d.ChunkSize * 1024 * 1024 ss, err := stream.NewStreamSectionReader(file, int(defaultChunkSize), &up) From 495493ec26c54aef98e2cfa21c17a38ffecfb496 Mon Sep 17 00:00:00 2001 From: jenfonro <799170122@qq.com> Date: Tue, 23 Sep 2025 16:45:01 +0800 Subject: [PATCH 2/3] fix performance and field --- drivers/google_drive/util.go | 66 +++++++++++++++++++++++++++++------- 1 file changed, 53 insertions(+), 13 deletions(-) diff --git a/drivers/google_drive/util.go b/drivers/google_drive/util.go index 0a4c2daaa..982192857 100644 --- a/drivers/google_drive/util.go +++ b/drivers/google_drive/util.go @@ -27,6 +27,14 @@ import ( // do others that not defined in Driver interface +// Google Drive API 字段常量 +const ( + // 文件列表查询字段 + FilesListFields = "files(id,name,mimeType,size,modifiedTime,createdTime,thumbnailLink,shortcutDetails,md5Checksum,sha1Checksum,sha256Checksum),nextPageToken" + // 单个文件查询字段 + FileInfoFields = "id,name,mimeType,size,md5Checksum,sha1Checksum,sha256Checksum" +) + type googleDriveServiceAccount struct { //Type string `json:"type"` //ProjectID string `json:"project_id"` @@ -235,7 +243,7 @@ func (d *GoogleDrive) getFiles(id string) ([]File, error) { } query := map[string]string{ "orderBy": orderBy, - "fields": "files(id,name,mimeType,size,modifiedTime,createdTime,thumbnailLink,shortcutDetails,md5Checksum,sha1Checksum,sha256Checksum),nextPageToken", + "fields": FilesListFields, "pageSize": "1000", "q": fmt.Sprintf("'%s' in parents and trashed = false", id), //"includeItemsFromAllDrives": "true", @@ -250,23 +258,38 @@ func (d *GoogleDrive) getFiles(id string) ([]File, error) { } pageToken = resp.NextPageToken - // 处理快捷链接,获取目标文件的大小信息 + // 批量处理快捷链接,只对文件快捷方式进行API调用 + shortcutTargetIds := make([]string, 0) + shortcutIndices := make([]int, 0) + + // 收集所有文件快捷方式的目标ID(跳过文件夹快捷方式) for i := range resp.Files { - if resp.Files[i].MimeType == "application/vnd.google-apps.shortcut" && resp.Files[i].ShortcutDetails.TargetId != "" { - // 获取目标文件的详细信息 - targetFile, err := d.getTargetFileInfo(resp.Files[i].ShortcutDetails.TargetId) - if err == nil && targetFile.Size != "" { - // 使用目标文件的大小信息 - resp.Files[i].Size = targetFile.Size - // 同时更新其他相关信息 + if resp.Files[i].MimeType == "application/vnd.google-apps.shortcut" && + resp.Files[i].ShortcutDetails.TargetId != "" && + resp.Files[i].ShortcutDetails.TargetMimeType != "application/vnd.google-apps.folder" { + shortcutTargetIds = append(shortcutTargetIds, resp.Files[i].ShortcutDetails.TargetId) + shortcutIndices = append(shortcutIndices, i) + } + } + + // 批量获取目标文件信息(只对文件快捷方式) + if len(shortcutTargetIds) > 0 { + targetFiles := d.batchGetTargetFilesInfo(shortcutTargetIds) + // 更新快捷方式文件的信息 + for j, targetId := range shortcutTargetIds { + if targetFile, exists := targetFiles[targetId]; exists { + fileIndex := shortcutIndices[j] + if targetFile.Size != "" { + resp.Files[fileIndex].Size = targetFile.Size + } if targetFile.MD5Checksum != "" { - resp.Files[i].MD5Checksum = targetFile.MD5Checksum + resp.Files[fileIndex].MD5Checksum = targetFile.MD5Checksum } if targetFile.SHA1Checksum != "" { - resp.Files[i].SHA1Checksum = targetFile.SHA1Checksum + resp.Files[fileIndex].SHA1Checksum = targetFile.SHA1Checksum } if targetFile.SHA256Checksum != "" { - resp.Files[i].SHA256Checksum = targetFile.SHA256Checksum + resp.Files[fileIndex].SHA256Checksum = targetFile.SHA256Checksum } } } @@ -282,7 +305,7 @@ func (d *GoogleDrive) getTargetFileInfo(targetId string) (File, error) { var targetFile File url := fmt.Sprintf("https://www.googleapis.com/drive/v3/files/%s", targetId) query := map[string]string{ - "fields": "id,name,mimeType,size,md5Checksum,sha1Checksum,sha256Checksum", + "fields": FileInfoFields, } _, err := d.request(url, http.MethodGet, func(req *resty.Request) { req.SetQueryParams(query) @@ -293,6 +316,23 @@ func (d *GoogleDrive) getTargetFileInfo(targetId string) (File, error) { return targetFile, nil } +// batchGetTargetFilesInfo 批量获取目标文件信息,顺序处理避免并发复杂性 +func (d *GoogleDrive) batchGetTargetFilesInfo(targetIds []string) map[string]File { + if len(targetIds) == 0 { + return make(map[string]File) + } + + result := make(map[string]File) + // 顺序处理,避免并发复杂性 + for _, targetId := range targetIds { + file, err := d.getTargetFileInfo(targetId) + if err == nil { + result[targetId] = file + } + } + return result +} + func (d *GoogleDrive) chunkUpload(ctx context.Context, file model.FileStreamer, url string, up driver.UpdateProgress) error { var defaultChunkSize = d.ChunkSize * 1024 * 1024 ss, err := stream.NewStreamSectionReader(file, int(defaultChunkSize), &up) From ea621824a133436eb31a7302454d7c12f973ccfd Mon Sep 17 00:00:00 2001 From: jenfonro <799170122@qq.com> Date: Wed, 8 Oct 2025 00:45:41 +0800 Subject: [PATCH 3/3] cn to en notes --- drivers/google_drive/util.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/google_drive/util.go b/drivers/google_drive/util.go index be2a440c9..e2e609a89 100644 --- a/drivers/google_drive/util.go +++ b/drivers/google_drive/util.go @@ -27,11 +27,11 @@ import ( // do others that not defined in Driver interface -// Google Drive API 字段常量 +// Google Drive API field constants const ( - // 文件列表查询字段 + // File list query fields FilesListFields = "files(id,name,mimeType,size,modifiedTime,createdTime,thumbnailLink,shortcutDetails,md5Checksum,sha1Checksum,sha256Checksum),nextPageToken" - // 单个文件查询字段 + // Single file query fields FileInfoFields = "id,name,mimeType,size,md5Checksum,sha1Checksum,sha256Checksum" ) @@ -258,11 +258,11 @@ func (d *GoogleDrive) getFiles(id string) ([]File, error) { } pageToken = resp.NextPageToken - // 批量处理快捷链接,只对文件快捷方式进行API调用 + // Batch process shortcuts, API calls only for file shortcuts shortcutTargetIds := make([]string, 0) shortcutIndices := make([]int, 0) - // 收集所有文件快捷方式的目标ID(跳过文件夹快捷方式) + // Collect target IDs of all file shortcuts (skip folder shortcuts) for i := range resp.Files { if resp.Files[i].MimeType == "application/vnd.google-apps.shortcut" && resp.Files[i].ShortcutDetails.TargetId != "" && @@ -272,10 +272,10 @@ func (d *GoogleDrive) getFiles(id string) ([]File, error) { } } - // 批量获取目标文件信息(只对文件快捷方式) + // Batch get target file info (only for file shortcuts) if len(shortcutTargetIds) > 0 { targetFiles := d.batchGetTargetFilesInfo(shortcutTargetIds) - // 更新快捷方式文件的信息 + // Update shortcut file info for j, targetId := range shortcutTargetIds { if targetFile, exists := targetFiles[targetId]; exists { fileIndex := shortcutIndices[j] @@ -300,7 +300,7 @@ func (d *GoogleDrive) getFiles(id string) ([]File, error) { return res, nil } -// getTargetFileInfo 获取目标文件的详细信息,用于快捷链接 +// getTargetFileInfo gets target file details for shortcuts func (d *GoogleDrive) getTargetFileInfo(targetId string) (File, error) { var targetFile File url := fmt.Sprintf("https://www.googleapis.com/drive/v3/files/%s", targetId) @@ -316,14 +316,14 @@ func (d *GoogleDrive) getTargetFileInfo(targetId string) (File, error) { return targetFile, nil } -// batchGetTargetFilesInfo 批量获取目标文件信息,顺序处理避免并发复杂性 +// batchGetTargetFilesInfo batch gets target file info, sequential processing to avoid concurrency complexity func (d *GoogleDrive) batchGetTargetFilesInfo(targetIds []string) map[string]File { if len(targetIds) == 0 { return make(map[string]File) } result := make(map[string]File) - // 顺序处理,避免并发复杂性 + // Sequential processing to avoid concurrency complexity for _, targetId := range targetIds { file, err := d.getTargetFileInfo(targetId) if err == nil {