无法使用python脚本和GCP服务帐户信用将upload_from_filename文件上传到GCP存储桶

时间:2019-03-14 11:02:23

标签: python google-cloud-platform cloud storage

•已安装Python 3.7.2 •创建了GCP服务帐户并为其赋予了所有者角色,还启用了存储API并创建了一个云存储桶 •现在,我尝试使用python脚本将文件上传到GCP云存储文件夹,但不能。但是,通过使用相同的结构,我能够创建新的云存储分区并能够在其中编辑现有文件 •这里附有pythonscript

使用的参考: https://googleapis.github.io/google-cloud-python/latest/storage/blobs.html https://cloud.google.com/storage/docs/uploading-objects#storage-upload-object-python

from google.cloud import storage

bucket_name='buckettest'
source_file_name='D:/file.txt'
source_file_name1='D:/jenkins structure.png'
destination_blob_name='test/'

def upload_blob(bucket_name, source_file_name, destination_blob_name):
    """Uploads a file to the bucket."""
    client = storage.Client.from_service_account_json('D:\gmailseviceaccount.json')
    bucket = client.create_bucket('bucketcreate')
    bucket = client.get_bucket(bucket_name)
    blob = bucket.blob(destination_blob_name)
    blob.upload_from_filename(source_file_name) 
    blob.upload_from_filename(source_file_name1)

    print('File {} uploaded to {}.'.format(
        source_file_name,
        destination_blob_name))

if __name__ == '__main__':
        upload_blob(bucket_name, source_file_name, destination_blob_name)

1 个答案:

答案 0 :(得分:0)

我能够运行您的代码并对其进行调试。我将在下面使用我的内容,并说明所做的更改。

与您一样,我将服务帐户设置为所有者,并且能够上传。建议您在完成测试后,至少遵循privileges的最佳做法。

  1. 我删除了client.create_bucket,因为存储桶是唯一的,所以我们不应该硬编码要创建的存储桶名称。您可以根据自己的需要提出命名约定,但是为了测试,我将其删除。
  2. 我修复了变量destination_blob_name,因为您将其用作要放置文件的文件夹。这将不起作用,因为GCS不使用文件夹,而是仅使用文件名。发生的事情是您实际上是在将TXT文件“转换”到名为“ test”的文件夹中。为了更好地理解,我建议您仔细阅读How Sub-directories Work上的文档。

    from google.cloud import storage
    
    bucket_name='bucket-test-18698335'
    source_file_name='./hello.txt'
    destination_blob_name='test/hello.txt'
    
    def upload_blob(bucket_name, source_file_name, destination_blob_name):
        """Uploads a file to the bucket."""
        client = storage.Client.from_service_account_json('./test.json')
        bucket = client.get_bucket(bucket_name)
        blob = bucket.blob(destination_blob_name)
        blob.upload_from_filename(source_file_name) 
    
        print('File {} uploaded to {}.'.format(
            source_file_name,
            destination_blob_name))
    
    if __name__ == '__main__':
            upload_blob(bucket_name, source_file_name, destination_blob_name)