Flask上传 - TypeError:save()得到一个意外的关键字参数'name'

时间:2014-12-22 23:15:54

标签: python-2.7 flask flask-wtforms flask-uploads

我正在尝试使用Flask上传文件,并在完成时写入重命名的文件。根据{{​​3}},save()具有用于此目的的名称参数。我收到TypeError:save()在使用下面的代码时得到了一个意外的关键字参数'name'。如果省略save函数的名称部分file.save(os.path.join('/ path / to / uploads',filename)),一切都按预期工作。

我的意图是将文件字段所在的wtform中的cust值作为写入的文件名,custvalue_filename.extension,从我尝试使用name = renfn证明。

views.py

def fc_upload():
    form = InvFcUploadForm(next=request.args.get('next'))
    if request.method == 'POST' and form.validate_on_submit():
        file = request.files['file']
        if file:
            filename = secure_filename(file.filename)
            renfn = str(form.cust.data) + '_' + filename + '.'
            file.save(os.path.join('/path/to/uploads',
                filename), name=renfn)
            flash('File uploaded.', 'success')
    return render_template('inventory/fc_upload.html', form=form)

我只是在学习python和Flask,所以我完全怀疑我错过了一些明显的东西。提前谢谢。

2 个答案:

答案 0 :(得分:0)

Per Flask的API文档中,files对象的request属性的内容是MultiDict对象,其值包含FileStorage个对象。从下面链接的Werkzeug文档中可以看出,这些对象的save()方法不接受name关键字参数。

http://werkzeug.pocoo.org/docs/0.9/datastructures/#werkzeug.datastructures.FileStorage

我自己没有测试过,但是在这种情况下要做你想做的事情,你可能想尝试修改filename对象的FileStorage属性。或者,以您希望的方式手动打开文件对象,并将其作为第一个参数传递给save()方法(如果您这样做,请记住在文件对象上调用close()左右)。

答案 1 :(得分:0)

我遇到了同样的问题,我通过使用类似

的方式解决了这个问题
file = request.files['file']
file.filename = "abc.txt"  #some custom file name that you want
file.save("Uploads/"+file.filename)