Uploading photo to Google Photos API not returning upload token

六眼飞鱼酱① 提交于 2019-12-05 06:03:01

I think you're just not looking at the Response content. The following works in Python, surely you can make it work for Java as well:

def upload_files(self, filepath, album_id):
    filename = os.path.basename(filepath)
    url = 'https://photoslibrary.googleapis.com/v1/uploads'
    authorization = 'Bearer ' + creds.access_token

    headers = {
        "Authorization": authorization,
        'Content-type': 'application/octet-stream',
        'X-Goog-Upload-File-Name': filename,
        'X-Goog-Upload-Protocol': 'raw',
    }
    with open(filepath, "rb") as image_file:
        response = requests.post(url, headers=headers, data=image_file)
        assert response.status_code == 200
        token = response.text  # !!!
    return service.mediaItems().batchCreate(body=dict(
        albumId=album_id,
        newMediaItems=[
            {"simpleMediaItem": {"uploadToken": token}}]
    )).execute()

You in fact do get a response body. If you look at your response

response: OK [200]
response headers:
    Alt-Svc: [quic=":443"; ma=2592000; v="44,43,39,35"]
    Server: [UploadServer]
    X-GUploader-UploadID: [AEnB2UqT6y8KyZNCPyAaFeCj7I_ABIlwLJQMpltYzQ7D8blW4v3uKSlMT7dbNjFV0i_7ApzoR-i26ZtZ9kHkB7bI8n8ojgOnNA]
    Content-Length: [510]
    Date: [Sun, 05 Aug 2018 11:19:15 GMT]
    Content-Type: [text/plain]
response body:
    null

there is the field Content-Length that indicates the length in bytes of the body, which is 510 in your case. Which method did you use to get this info? And what is your current implementation?

If you only tried to do the request e.g. via curl then I actually have no idea, why there is no response body, but then it wouldn't fit into the scope of the java tag anyways, so I'm assuming you parsed the response yourself in some self-written java code?

Because you didn't provide it, this is only speculation, but I'm assuming you missed something, when parsing the response.

This is working for me, the r.content returned in the below method is what contains the upload token which you will need to pass to the MediaItems:batchCreate API call in order the create the media in the user's library:

def upload(your_access_token, your_media_path):
item = open(your_media_path, 'rb').read()
url = 'https://photoslibrary.googleapis.com/v1/uploads'
headers = {
    'Authorization': 'Bearer ' + token,
    'Content-Type': 'application/octet-stream',
    'X-Goog-Upload-File-Name': 'image1.jpg',
    'X-Goog-Upload-Protocol': 'raw',
}

r = requests.post(url, data = item, headers = headers)
return r.content.decode('utf-8')
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!