文章内容
2018/7/25 13:51:43,作 者: 黄兵
Flask文件上传
最近需要上传用户头像,使用的是jqyer.ajax,在使用的时候中间有一些问题,具体可以参考这里:contentType = false相关问题思考
<!-- CHANGE AVATAR TAB -->
<div class="tab-pane" id="tab_1_2">
<p> 请上传小于3M的文件。 </p>
<form action="{{ url_for('manage.upload_file') }}" role="form"
enctype=multipart/form-data method="post">
<div class="form-group">
<div class="fileinput fileinput-new" data-provides="fileinput">
<div class="fileinput-new thumbnail"
style="width: 200px; height: 150px;">
<img src="http://www.placehold.it/200x150/EFEFEF/AAAAAA&text=no+image"
alt=""/>
</div>
<div class="fileinput-preview fileinput-exists thumbnail"
style="max-width: 200px; max-height: 150px;"></div>
<div>
<span class="btn default btn-file">
<span class="fileinput-new"> 选择图片 </span>
<span class="fileinput-exists"> Change </span>
<input type="file" name="file" id="ingredient_file">
</span>
<a href="javascript:;" class="btn default fileinput-exists"
data-dismiss="fileinput"> Remove </a>
</div>
</div>
<div class="clearfix margin-top-10">
<span class="label label-danger">NOTE! </span>
<span>Attached image thumbnail is supported in Latest Firefox, Chrome, Opera, Safari and Internet Explorer 10 only </span>
</div>
</div>
<div class="margin-top-10">
<button class="btn green" type="submit" id="upload_file">Submit</button>
<a href="javascript:;" class="btn default"> Cancel </a>
</div>
</form>
</div>
<!-- END CHANGE AVATAR TAB -->
jquery.ajax代码:
$(function () {
$('#upload_file').click(function (event) {
event.preventDefault();
upload_file();
});
// Inject our CSRF token into our AJAX request.
var csrftoken = $('meta[name=csrf-token]').attr('content')
$.ajaxSetup({
beforeSend: function (xhr, settings) {
if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken)
}
}
})
})
function upload_file() {
var formData = new FormData();
formData.append("file", $('#ingredient_file')[0].files[0])
// add assoc key values, this will be posts values
$.ajax({
type: $('#tab_1_2 form').attr("method"),
url: $('#tab_1_2 form').attr("action"),
data: formData,
contentType: false,
processData: false,
success: function (data) {
console.log(data);
}
})
}
后台使用的是flask,具体代码:
@manage.route('/upload_file', methods=['GET', 'POST']) @login_required def upload_file(): if request.method == 'POST': file = request.files['file'] if file and allowed_file(file.filename): filename = secure_filename(file.filename) file.save(os.path.join(current_app.config['UPLOAD_FOLDER'], filename)) old_path = os.path.join(current_app.config['UPLOAD_FOLDER'], filename) new_filename = str(uuid.uuid4()) + '.' + filename.rsplit('.', 1)[1] new_path = os.path.join(current_app.config['UPLOAD_FOLDER'], new_filename) # rename file os.rename(old_path, new_path) # save as file name to database current_user.profile_picture = new_filename db.session.add(current_user._get_current_object()) db.session.commit() return '0' return '1'
上传完文件之后重命名(命名方式使用的是UUID),将文件名存入数据库。
上传的时候出现了路径不对,修改了路径问题解决。
文件所在路径(注意:红框是上传文件夹):
上传路径和允许文件扩展名:
# file upload path and file upload extensions UPLOAD_FOLDER = os.environ.get('UPLOAD_FOLDER', 'app/static/uploads') ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif'])
判断文件是否允许上传:
def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1] in Config.ALLOWED_EXTENSIONS
还可以使用flask-uploads模块上传,我这里没有使用。
参考资料:
Python使用UUID库生成唯一ID
学习python之 os.rename VS os.names
黄兵个人博客原创。
转载请注明出处:黄兵个人博客 - Flask文件上传
评论列表