如何使用StringIO和boto3的put_object方法将URL上传到S3存储桶中
如何使用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?
问题:如何使用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'参数,可能会导致上传失败。