Ubuntu One:PUT 上传大于 16302 字节的文件系统失败

Ubuntu One:PUT 上传大于 16302 字节的文件系统失败

我正在尝试创建一个使用云 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 文档中看到对此的记录。

希望这对遇到类似问题的人有所帮助。

相关内容