如何使用StringIO和boto3的put_object方法将URL上传到S3存储桶中

12 浏览
0 Comments

如何使用StringIO和boto3的put_object方法将URL上传到S3存储桶中

我需要将URL上传到一个s3存储桶,并且正在使用boto3。我以为在这个问题中找到了解决方案:如何使用boto3将S3对象保存到文件中,但是当我尝试下载文件时,仍然遇到错误。目标是将它们作为音频文件下载,而不是URL。我的代码:\n

    for row in list_reader:
        media_id = row['mediaId']
        external_id = row['externalId']
        with open('10-17_res1.csv', 'a') as results_file:
            file_is_empty = os.stat('10-17_res1.csv').st_size == 0
            results_writer = csv.writer(
            results_file, delimiter = ',', quotechar = '"'
            )
            if file_is_empty:
                results_writer.writerow(['fileURL','key', 'mediaId','externalId'])
            key = 'corpora/' + external_id + '/' + external_id + '.flac'
            bucketname = 'my_bucket'
            media_stream = media.get_item(media_id)
            stream_url = media_stream['streams'][0]['streamLocation']
            fake_handle = StringIO(stream_url)
            s3c.put_object(Bucket=bucketname, Key=key, Body=fake_handle.read())

\n我的问题是,我需要做哪些更改,才能将文件保存为音频文件而不是URL?

0
0 Comments

问题:如何使用StringIO和put_object方法将URL上传到S3存储桶?

原因:在使用boto3库的put_object方法将URL上传到S3存储桶时,遇到了问题。

解决方法:通过使用smart_open模块解决了这个问题,代码如下:

import smart_open
import boto3
from io import BytesIO
stream_url = '要上传的URL'
bucketname = 'S3存储桶名称'
key = '上传后的文件名'
# 使用smart_open模块打开URL,并以二进制模式读取内容
with smart_open.open(stream_url, 'rb', buffering=0) as f:
    # 创建一个BytesIO对象,用于保存文件内容
    file_content = BytesIO(f.read())
    s3 = boto3.client('s3')
    # 将文件内容通过put_object方法上传到S3存储桶
    s3.put_object(Bucket=bucketname, Key=key, Body=file_content)

需要注意的是,如果不指定'buffering=0'参数,可能会导致上传失败。

0