flask 上传的文件只能放在项目的根目录下么?

小艾利缇
  • 72

用flask做的后台,在尝试上传文件的时候,若是 UPLOAD_FOLDER = 'tmp'这么配置(tmp 是文件根目录下的一个文件夹),是可以成功上传的,但是在读取这个文件的时候,路径怎么写都不对,当我把 tmp这个文件夹移到static下之后就可以顺利的通过路径找到,但是这样就无法上传了,若是把配置改为UPLOAD_FOLDER = 'static/tmp/'上传就会报错,找不到这个路径,简直郁闷死了。在项目根目录下的文件要怎么写路径才能找到呢,又或者怎么才能把保存文件的路径改为'static/tmp/'呢??flask新手一枚,实在不懂,求大神告知。

补充一下我的代码:

app = flask.Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'tmp'

@app.route('/', methods=['POST'])
def upload_file():
    file = request.files['file']
    filename = secure_filename(file.filename)
    file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
    return 'upload success'
    

目录结构是这样的:

project
    --app
        --static
        --templates
        --__init__.py
        --其他文件...
    --tmp
    --config.py
    --run.py

目录结构大概就是这个样子的,这种情况下文件是可以上传到tmp文件夹里的,但是没法通过路径读出来(可能是我不会写,试了很多种写法都不对!- -),如果把tmp文件夹移到static目录下,就可以找到,但是这样就无法上传了,把配置文件改成app.config['UPLOAD_FOLDER'] = 'static/tmp/'就会报错。

回复
阅读 10.5k
3 个回答

Flask资源定位是依靠

app = Flask(__name__)

__name__参数(文件名或包名),所以相对定位一定要基于这个文件路径。为什么会在static文件夹路径下会正确?Flask默认静态文件在static文件下。可以参考Flask API文档,有详细说明。


http://stackoverflow.com/questions/15044094/flask-static-files-in-subdirectories 可以解决问题

另外static中文件的访问方式是:

url_for('static', filename='/tmp/'+u'文件名')

如果temp不在static文件夹下这种情况是可以的。
app.config['UPLOAD_FOLDER'] = '/tmp/' 试一试。
之前的static访问方式我写错了,不好意思

可能是要绝对路径,你设置tmp有可能是因为系统根目录下有个tmp,即/tmp,所以可以上传成功,而你在项目目录下不存在tmp文件夹,所以读取相对路径project/tmp是不存在的。就像找不到绝对路径/static/tmp,我猜是这样,就是说配置路径是绝对路径。

宣传栏