我正在尝试创建一个使用云 API 将文件上传/下载到 Ubuntu One 的应用程序。现在我正处于实现应用程序的上传部分的阶段,我的测试用例遇到了这个问题:
所有小于 16303 字节的文件均可顺利上传。
所有超过 16303 字节的文件都会系统地上传失败,并返回 500 状态代码。
我花了几个小时在网上搜索类似的问题,但无济于事。
我使用的是 Go 语言,以下是对 Ubuntu One REST API 的调用(为了简洁起见,删除了错误处理和内务处理代码):
// 'n' is an object which describes the file to upload (path, size, etc.)
file, _ := os.Open(localTargetDir + n.Path)
apiUrl, _ := url.Parse("https://files.one.ubuntu.com/content" + remoteTargetDir + n.Path)
// Following line returns a pointer to a Request object with the "Authorization"
// fields in the header all properly set
request, _ := ubuntuoneGetSignedRequest("PUT", apiUrl.String(), file)
request.Header.Add("Content-Length", fmt.Sprintf("%d", n.Size))
request.Header.Add("Content-Type", "application/octet-stream")
response, _ := http.DefaultClient.Do(request)
if response.StatusCode >= 300 {
return errors.New(fmt.Sprintf("Error (status=%d) creating remote file: %s", response.StatusCode, n.Path))
}
// ...
如上所述,文件大小为 16303-16304 字节是上传开始系统性失败的关键点。我不知道问题出在哪里。
答案1
终于找到问题了。这是 Go 语言的问题,不是 Ubuntu One 的问题。
显然,该字段request.ContentLength
需要正确设置:
request.Header.Add("Content-Type", "application/octet-stream")
request.ContentLength = n.Size
response, _ := http.DefaultClient.Do(request)
回想起来这似乎很明显(实际上并非如此,因为它对于小于 16304 的文件运行良好......),但我还没有在 Go 文档中看到对此的记录。
希望这对遇到类似问题的人有所帮助。