首页 > 解决方案 > 应用程序成功推送到heroku,但如何正确引用文件名,使其像在本地主机中一样在线工作

问题描述

所以,我已经成功地将我的应用程序推送到 Heroku 并打开了! faces-application但现在上传和功能已损坏。

我几乎可以肯定我引用文件名的方式是问题,现在它不在我的 localhost 机器上。

项目结构

heroku 文件结构(可能只是 slug - 我不确定)

UPLOAD_FOLDER_FACES = 'static/uploads/faces/'
app.config['UPLOAD_FOLDER_FACES'] = UPLOAD_FOLDER_FACES
@app.route("/AddFace", methods=["GET", "POST"])
def add_face():
    if 'image' not in request.files:
        flash('No file part')
        return redirect(request.url)
    file = request.files['image']
    if file.filename == '':
        flash('No image selected for uploading')
        return redirect(request.url)
    if file and allowed_file(file.filename):
        filename = secure_filename(file.filename)

# I think the issue is here, how I am saving the file and handling it.
# If someone could please share some insight into the correct way to 
# handle files in heroku hosted python flask apps.

        file.save(os.path.join(app.config['UPLOAD_FOLDER_FACES'], filename))
        
        copyfile("static/uploads/faces/" + filename, "faces/" + filename)
        flash('Face successfully uploaded, saved and displayed')
        return render_template('addface.html', filename=filename)
    else:
        flash('Allowed image types are -> png, jpg, jpeg, gif')
        return redirect(request.url)
    return render_template("addface.html")
2020-08-24T16:54:47.951941+00:00 app[web.1]: [2020-08-24 16:54:47,949] ERROR in app: Exception on /NameTag [GET]
2020-08-24T16:54:47.951955+00:00 app[web.1]: Traceback (most recent call last):
2020-08-24T16:54:47.951956+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", line 2447, in wsgi_app
2020-08-24T16:54:47.951957+00:00 app[web.1]: response = self.full_dispatch_request()
2020-08-24T16:54:47.951957+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", line 1952, in full_dispatch_request
2020-08-24T16:54:47.951958+00:00 app[web.1]: rv = self.handle_user_exception(e)
2020-08-24T16:54:47.951958+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", line 1821, in handle_user_exception
2020-08-24T16:54:47.951959+00:00 app[web.1]: reraise(exc_type, exc_value, tb)
2020-08-24T16:54:47.951959+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flask/_compat.py", line 39, in reraise
2020-08-24T16:54:47.951960+00:00 app[web.1]: raise value
2020-08-24T16:54:47.951961+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", line 1950, in full_dispatch_request
2020-08-24T16:54:47.951961+00:00 app[web.1]: rv = self.dispatch_request()
2020-08-24T16:54:47.951961+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", line 1936, in dispatch_request
2020-08-24T16:54:47.951962+00:00 app[web.1]: return self.view_functions[rule.endpoint](**req.view_args)
2020-08-24T16:54:47.951963+00:00 app[web.1]: File "/app/gui.py", line 194, in name
2020-08-24T16:54:47.951963+00:00 app[web.1]: images = os.listdir(os.path.join(app.static_folder, "nametag"))
2020-08-24T16:54:47.951969+00:00 app[web.1]: FileNotFoundError: [Errno 2] No such file or directory: '/app/static/nametag'

我是否需要构建我的应用程序以使所有内容都驻留在 /app/ 中? /应用程序/

我已经更改了项目结构并创建了一个新版本。推送到 Heroku 并像以前一样打开应用程序。

heroku 实时部署

但是,我仍然收到未找到文件的错误。

新结构

我修改了引用以包括 app/

UPLOAD_FOLDER_FACES = '/app/static/uploads/faces/'

但是这个错误仍然存​​在:

2020-08-25T08:30:26.942622+00:00 app[web.1]: [2020-08-25 08:30:26,940] ERROR in app: Exception on /AddFace [POST]
2020-08-25T08:30:26.942634+00:00 app[web.1]: Traceback (most recent call last):
2020-08-25T08:30:26.942635+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", line 2447, in wsgi_app
2020-08-25T08:30:26.942635+00:00 app[web.1]: response = self.full_dispatch_request()
2020-08-25T08:30:26.942636+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", line 1952, in full_dispatch_request
2020-08-25T08:30:26.942636+00:00 app[web.1]: rv = self.handle_user_exception(e)
2020-08-25T08:30:26.942637+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", line 1821, in handle_user_exception
2020-08-25T08:30:26.942637+00:00 app[web.1]: reraise(exc_type, exc_value, tb)
2020-08-25T08:30:26.942637+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flask/_compat.py", line 39, in reraise
2020-08-25T08:30:26.942638+00:00 app[web.1]: raise value
2020-08-25T08:30:26.942638+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", line 1950, in full_dispatch_request
2020-08-25T08:30:26.942638+00:00 app[web.1]: rv = self.dispatch_request()
2020-08-25T08:30:26.942638+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", line 1936, in dispatch_request
2020-08-25T08:30:26.942639+00:00 app[web.1]: return self.view_functions[rule.endpoint](**req.view_args)
2020-08-25T08:30:26.942639+00:00 app[web.1]: File "/app/gui.py", line 139, in add_face
2020-08-25T08:30:26.942640+00:00 app[web.1]: file.save(os.path.join(app.config['UPLOAD_FOLDER_FACES'], filename))
2020-08-25T08:30:26.942640+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/werkzeug/datastructures.py", line 3066, in save
2020-08-25T08:30:26.942640+00:00 app[web.1]: dst = open(dst, "wb")
2020-08-25T08:30:26.942646+00:00 app[web.1]: FileNotFoundError: [Errno 2] No such file or directory: '/app/static/uploads/faces/Bret_Point.jpg'
2020-08-25T08:30:26.943461+00:00 app[web.1]: 10.32.185.71 - - [25/Aug/2020:08:30:26 +0000] "POST /AddFace HTTP/1.1" 500 290 "https://faces-application.herokuapp.com/AddFace" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0"

static/sample/ 中的图像在适当的页面上成功加载。

静态图像工作

但是在尝试上传要使用的图像时,找不到该文件。

我一直在阅读 Heroku 使用 /tmp/ 进行上传....

heroku tmp 文件夹

我需要上传到 tmp/ 目录吗?

标签: pythonflaskherokuos.path

解决方案


解决方案:

要在 heroku 上使用临时/临时存储,您必须引用 /tmp 作为上传目标。

UPLOAD_FOLDER_FACES = '/tmp/'

将引用(如上所示)从 app/static/... 修改为 /tmp/ 有效!但是,之后的复制指令没有。

copyfile("/tmp/" + filename, "tmp/faces/" + filename)

我想如果可以将文件添加到 tmp 目录,他们应该也可以将目录添加到 tmp 。在尝试复制文件之前,我可能需要先在 tmp 中创建 faces 目录,这就是为什么我收到有关该行的错误。

尽管如此,要访问 Heroku 部署的应用程序上的临时存储,请使用

/tmp/

推荐阅读