简体   繁体   中英

Google Cloud Storage: download a file with a different name

I'm wondering if it's possible to download a file from Google Cloud Storage with a different name than the one that has in the bucket.

For example, in Google Cloud Storage I have stored a file named 123-file.txt but when I download it I would like choose a different name, let's say file.txt

I've noticed that the link for download it is like: https://storage.cloud.google.com/bucket_name%2F123-file.txt?response-content-disposition=attachment;%20filename=123-file.txt

So I've tried to change it to: https://storage.cloud.google.com/bucket_name%2F123-file.txt?response-content-disposition=attachment;%20filename=file.txt

But it still keeps downloading as 123-file.txt instead of file.txt

The response-content-disposition parameter can only be used by authorized requests. Anonymous links don't work with it. You have a few options:

  1. The content-disposition of a particular object is part of its metadata and can be permanently set. If you always want a specific file to be downloaded with a specific name, you can just permanently set the content-disposition metadata for the object.

  2. You can also generate signed URLs that include the response-content-disposition query parameter. Then the users will be making authorized requests to download the resource.

example (first option Brandon Yarbrough) with javascript library:

const storage = new Storage()
const fileBucket = storage.bucket('myBucket')
const file = fileBucket.file('MyOriginalFile.txt')
const newName = "NewName.txt"
await file.save(content, {
    metadata: {
      contentDisposition: `inline; filename="${newName}"`
    }
  })

the following is a part of a python script i've used to remove the forward slashes - added by google cloud buckets when to represent directories - from multiple objects, it's based on this blog post , please keep in mind the double quotes around the content position "file name"

def update_blob_download_name(bucket_name):
    """ update the download name of blobs and remove
    the path. 
    :returns: None
    :rtype: None
    """
    # Storage client, not added to the code for brevity 
    client = initialize_google_storage_client()
    bucket = client.bucket(bucket_name)
    for blob in bucket.list_blobs():
        if "/" in blob.name:
            remove_path = blob.name[blob.name.rfind("/") + 1:] # rfind gives that last occurence of the char
            ext = pathlib.Path(remove_path).suffix
            remove_id = remove_path[:remove_path.rfind("_id_")]
            new_name = remove_id + ext
            blob.content_disposition = f'attachment; filename="{new_name}"'
            blob.patch()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM