как загрузить файл на s3 с помощью boto3, когда файл находится в локальном хранилище - PullRequest
1 голос
/ 01 марта 2020

Сначала я пытаюсь сделать

, получить от пользователя ввод в виде формы Excel

секунду, обработать его кодом python,

в-третьих, загрузите его на aws s3 с помощью boto3

Но у меня возникают проблемы с загрузкой на 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, - это 'объект результата ', который является результатом функции select_bestitem

Но я не знаю, что передать в аргумент имени файла

Кажется, мне нужно указать путь к файлу, но я не могу найти путь к файлу, хранящемуся в localstorage

Плюс, я действительно не уверен, работает ли он, даже если я передаю правильный путь к файлу, так как тип файла

Я пытается загрузить строку

(я создал объект 'result' с помощью команды Pandas to_csv, и он выглядит как-то w boto3 отвергает этот тип)

Я новичок в python и flask, поэтому любая помощь будет отличной! Заранее спасибо :)

1 Ответ

3 голосов
/ 01 марта 2020

Да, вы правы. Нам нужно указать путь к файлу, который нужно загрузить. 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

Дайте мне знать, если это поможет!

...