From 560097145b8dd7276af9ebb8e9f5a5dc2dc9ee65 Mon Sep 17 00:00:00 2001 From: HFO4 <912394456@qq.com> Date: Sat, 15 Oct 2022 09:20:25 +0800 Subject: [PATCH] fix: metadata mismatch if file name contains `%` while uploading to OneDrive/SharePoint --- pkg/filesystem/driver/onedrive/api.go | 7 +++++- pkg/filesystem/driver/onedrive/api_test.go | 27 +++++++++++++++++----- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/pkg/filesystem/driver/onedrive/api.go b/pkg/filesystem/driver/onedrive/api.go index c89e0d3..e1a2219 100644 --- a/pkg/filesystem/driver/onedrive/api.go +++ b/pkg/filesystem/driver/onedrive/api.go @@ -37,9 +37,14 @@ const ( // GetSourcePath 获取文件的绝对路径 func (info *FileInfo) GetSourcePath() string { + res, err := url.PathUnescape(info.ParentReference.Path) + if err != nil { + return "" + } + return strings.TrimPrefix( path.Join( - strings.TrimPrefix(info.ParentReference.Path, "/drive/root:"), + strings.TrimPrefix(res, "/drive/root:"), info.Name, ), "/", diff --git a/pkg/filesystem/driver/onedrive/api_test.go b/pkg/filesystem/driver/onedrive/api_test.go index 14c2438..3ca7a33 100644 --- a/pkg/filesystem/driver/onedrive/api_test.go +++ b/pkg/filesystem/driver/onedrive/api_test.go @@ -138,13 +138,28 @@ func TestRequest(t *testing.T) { func TestFileInfo_GetSourcePath(t *testing.T) { asserts := assert.New(t) - fileInfo := FileInfo{ - Name: "文件名.jpg", - ParentReference: parentReference{ - Path: "/drive/root:/123/321", - }, + + // 成功 + { + fileInfo := FileInfo{ + Name: "%e6%96%87%e4%bb%b6%e5%90%8d.jpg", + ParentReference: parentReference{ + Path: "/drive/root:/123/32%201", + }, + } + asserts.Equal("123/32 1/%e6%96%87%e4%bb%b6%e5%90%8d.jpg", fileInfo.GetSourcePath()) + } + + // 失败 + { + fileInfo := FileInfo{ + Name: "123.jpg", + ParentReference: parentReference{ + Path: "/drive/root:/123/%e6%96%87%e4%bb%b6%e5%90%8g", + }, + } + asserts.Equal("", fileInfo.GetSourcePath()) } - asserts.Equal("123/321/文件名.jpg", fileInfo.GetSourcePath()) } func TestClient_GetRequestURL(t *testing.T) {