Как сохранить загруженный файл в Heroku, используя Flask в Python? - PullRequest
0 голосов
/ 08 мая 2020

Я сделал приложение, в которое можно загружать изображения. На локальном сервере Flask все работает нормально. Но когда я развернул свое приложение на Heroku, после загрузки изображения оно не сохраняется в указанном каталоге. Пожалуйста, приветствуем любую помощь.

from flask import Flask,redirect,request,url_for
from flask import render_template as ren
import os
from werkzeug.utils import secure_filename
import uuid
app = Flask(__name__)

# FILE_PATH = os.environ.get("FILE_PATH")
FILE_PATH = "templates/uploads/"

@app.route("/")
def home():
    return ren("index.html")

@app.route("/img-upload", methods=['GET','POST'])
def upload():
    if request.method == 'POST':

        if request.files:

            image = request.files['image']
            id = uuid.uuid1()

            if secure_filename(image.filename):
                filename = image.filename
                ext =  filename.rsplit(".",1)[1]
                filename = id.hex + "." + ext  ######### FileName of uploaded file ############
                file_path = os.path.join(str(FILE_PATH),secure_filename(filename))
                print(file_path)
                image.save(file_path)
                return redirect(request.url)

    return ren("index.html")


if __name__ == '__main__':
     app.run(debug=True)

1 Ответ

0 голосов
/ 08 мая 2020

Heroku имеет эфемерную файловую систему - это означает, что файл сохраняется в Heroku только во время работы дино, а затем удаляется. изображения там.

Вот хорошая ссылка, чтобы начать работу с AWS S3, а также как его настроить и использовать: https://www.youtube.com/watch?v=kt3ZtW9MXhw

После настройки AWS Ковш S3:

import boto3

BUCKET = 'my-bucket-name'
s3 = boto3.client("s3", aws_access_key_id=os.environ.get('AWS_ACCESS_KEY_ID'), aws_secret_access_key=os.environ.get('AWS_SECRET_ACCESS_KEY'))
bucket_resource = s3

bucket_resource.upload_file(Bucket = BUCKET, Filename=picture_fn, Key=picture_fn) # uploading

# retrieving
image_file = s3.generate_presigned_url('get_object',
                                Params={
                                    'Bucket': BUCKET,
                                    'Key': picture_fn,
                                },                                  
                                ExpiresIn=3600)

# deleting
s3.delete_object(Bucket=BUCKET, Key=picture_fn)
...