ufilesdk-dev / ufile-gosdk

UCloud 对象存储官方 SDK
https://www.ucloud.cn/
Apache License 2.0
34 stars 27 forks source link

key以/开始 #7

Closed clpdyhm closed 5 years ago

clpdyhm commented 5 years ago

问题描述: 调用函数DownloadFile下载文件时,运行到行 err := u.HeadFile(keyName) 出错。错误内容:Remote response code is 403 - Forbidden not 2xx call DumpResponse(true) show details%!(EXTRA string=HTTP/1.1 403 X-Sessionid: 95f34139-862d-4c4f-a8ac-1bb0af6c675fServer: nginx/1.11.1Date: Tue, 30 Oct 2018 11:22:42 GMTContent-Type: application/jsonContent-Length: 53Connection: keep-aliveVary: Origin) 传入的参数:keyName= “/data/a/b/c.txt” 试图解决: 运行demo_downloadfile.go,如果使用默认文件名称,完全正确。如果将文件名称替换为:"/data/a/b/c.txt",在运行到PutFile函数时,报错:HTTP/1.1 403 Content-Type: application/jsonContent-Length: 53Connection: keep-aliveX-Sessionid: d7ce59c2-80bd-45d9-93d8-45408a8aadb3Server: nginx/1.11.1Date: Tue, 30 Oct 2018 11:27:07 GMT{ "RetCode": -148658, "ErrMsg": "invalid signature" } 初步判定原因:keyName以'/'开始,服务端验证签名失败。 疑问:为什么以'/'开始,导致403?请针对这种情况修正一下代码。

leyafo commented 5 years ago

感谢反馈,已经修复。 https://github.com/ufilesdk-dev/ufile-gosdk/commit/a1e2e2965294e4532177ef1d7c6ab2876c6b1e2a

clpdyhm commented 5 years ago

@leyafo 这种修改还是不可以。因为:u.baseURL.String()最后是没有'/'的 所以,还是需要使用老办法: return fmt.Sprintf("http://%s.%s/%s", u.BucketName, u.Host, keyName)

leyafo commented 5 years ago

@clpdyhm 出现过问题了吗?这一行代码就是为了防止你说的问题

clpdyhm commented 5 years ago

@leyafo 亲测,不可行。 我还是使用的老办法。 直接:return fmt.Sprintf("http://%s.%s/%s", u.BucketName, u.Host, keyName)

leyafo commented 5 years ago

你给我看看你的config参数怎么填,什么情况下会发生这种错误。之前这种做法有很多问题,代码会锁死在单一配置无法满足一些自定义域名的host,所有才改成了现在的这种方式。

clpdyhm commented 5 years ago

已经解决了,没有看到还有一行代码:req.baseURL.Path = "/" //for default usage.