0
votes

I have made an app where image can be uploaded. Everything is working fine in the local server of Flask. But when I deployed my app on Heroku, after uploading an image it is not getting stored in the mentioned directory. Please any kind of help would be appreciated.

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

1 Answers

0
votes

Heroku has a ephemeral filesystem -- meaning that the file is only saved in Heroku while the dyno is running and is deleted afterwards.

The option I would use is AWS S3, where I have stored images on there.

Here's a good link to get you started with AWS S3 and how to set it up and use it: https://www.youtube.com/watch?v=kt3ZtW9MXhw

After you have set up your AWS S3 bucket:

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)