首页 > 解决方案 > 当文件在本地存储中时,如何使用 boto3 将文件上传到 s3

问题描述

我想做的是

首先,从用户那里获取作为 excel 表单的输入

其次,用python代码处理它,

三、用boto3上传到aws s3

但我无法上传到 s3

s3 = boto3.client(
"s3",
aws_access_key_id=access_key,
aws_secret_access_key=secret_key
)
bucket_resource = s3

我首先创建了 s3 对象,然后

        excel_file = pd.read_excel(file.stream)
    try:
        result = compute.select_bestitem(excel_file, brand_name, col_name, methods, operator, value)
        filename = secure_filename(file.filename)
        bucket_resource.upload_file(
            Bucket=bucket_name,
            Filename=,
            Key=filename
        )

我已经将文件作为 file = request.files['file'],并将其传递给我之前定义的函数

现在,我要上传到 S3 的文件是 'result object',它是 select_bestitem 函数的结果

但我不知道传递给 Filename 参数的内容

似乎我必须为其提供文件路径,但我找不到存储在 localstorage 中的文件路径

另外,即使我传递了正确的文件路径,我也不确定它是否有效,因为文件的类型

我要上传的是字符串

(我用 Pandas to_csv 命令创建了“结果”对象,看起来 boto3 以某种方式拒绝了这种类型)

我对 python 和烧瓶的东西很陌生,所以任何帮助都会很棒!提前致谢 :)

标签: pythonamazon-web-servicesflaskamazon-s3boto3

解决方案


嗯你是对的。我们需要提供需要上传的文件的路径。 request.files['file']给出文件指针并使用该指针,您可以将文件保存到一个位置。保存文件的路径可以使用os.path.join(UPLOAD_FOLDER, f.filename)如下所示:

@app.route("/upload", methods=['POST'])
def upload():
    if request.method == "POST":
        f = request.files['file']
        file_path=os.path.join(UPLOAD_FOLDER, f.filename) # path where file can be saved
        f.save(file_path)
        upload_file(file_path, BUCKET) # send the file path
        return redirect("/storage")

之后,可以看出,我调用upload_file了将写入 s3 的方法,该函数的代码如下所示:

BUCKET = "flaskdrive"
AWS_ACCESS_KEY="aws_access_key"
AWS_SECERT_KEY="aws_secret_key"

def upload_file(file_name, bucket):
    """
    Function to upload a file to an S3 bucket
    """
    object_name = file_name
    s3_client = boto3.client('s3',
                             aws_access_key_id=AWS_ACCESS_KEY,
                             aws_secret_access_key=AWS_SECERT_KEY)
    response = s3_client.upload_file(filename=file_name, bucket=bucket, key=object_name)

    return response

让我知道这是否有帮助!


推荐阅读