Ubuntu One: PUT для загрузки файла размером более 16302 байт систематически не работает
Я пытаюсь создать приложение для загрузки / выгрузки файлов в Ubuntu One, используя облачный API. Сейчас я нахожусь в стадии реализации части загрузки приложения, и у меня есть эта проблема с моим тестовым примером:
Все файлы размером до 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.
Надеемся, что это будет полезно для кого-то, кто сталкивается с подобной проблемой.