文件上传是一项必要的功能,几乎在所有的应用程序中都会用到。本篇文章将向您介绍一个快捷、便捷、安全的文件上传接口,并为您提供完整的代码示例。
一、选择上传文件
在使用文件上传接口之前,首先需要实现文件选择功能。在前端页面中,可以使用HTML中的input标签,并给其添加type='file'属性,如下所示:
<input type='file' name='file' />
在后端代码中,可以使用Python中的flask框架,如下所示:
from flask import Flask, request app = Flask(__name__) @app.route('/upload', methods=['POST']) def upload_file(): file = request.files['file'] file.save('uploads/' + file.filename) return 'upload success!' if __name__ == '__main__': app.run()
上述代码中,我们使用了flask框架来创建一个后端应用程序,并在其中实现了文件上传的相关功能。其中,使用了request对象中的files属性来获取上传的文件,并使用了save()方法将文件保存到指定的文件夹路径。
二、限制文件上传类型和大小
为了确保系统的安全性和稳定性,我们需要限制用户上传的文件类型和大小。在前端页面中,我们可以使用HTML的accept属性,如下所示:
<input type='file' name='file' accept='image/*' />
在后端代码中,我们可以使用flask框架的request对象和werkzeug库中的FileStorage对象,如下所示:
from flask import Flask, request from werkzeug.utils import secure_filename app = Flask(__name__) app.config['UPLOAD_FOLDER'] = './uploads' app.config['ALLOWED_EXTENSIONS'] = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif']) app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS'] @app.route('/upload', methods=['POST']) def upload_file(): file = request.files['file'] if file and allowed_file(file.filename): filename = secure_filename(file.filename) file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) return 'upload success!' else: return 'file type not allowed!' if __name__ == '__main__': app.run()
上述代码中,我们为应用程序设置了上传文件的存储路径、允许上传的文件类型和大小。并使用了allowed_file()方法来判断上传的文件类型是否在允许的列表中。如果是,则使用secure_filename()方法确保文件名的安全性,并使用save()方法保存文件到指定的文件夹路径。如果不是,则返回错误信息。
三、进度显示和断点续传
为了提高用户体验,我们可以为文件上传添加进度显示和断点续传的功能。在前端页面中,可以使用HTML5自带的XMLHttpRequest对象和FormData对象,并依赖于jQuery库进行封装,如下所示:
$('form').submit(function(e){ e.preventDefault(); var formData = new FormData(this); $.ajax({ xhr: function() { var xhr = $.ajaxSettings.xhr(); if(xhr.upload) { xhr.upload.addEventListener('progress', function(event) { var percent = Math.floor(event.loaded / event.total * 100); $('progress').attr('value', percent); $('.progress-bar').width(percent + '%'); $('.progress-bar').text(percent + '%'); }, false); } return xhr; }, type: 'POST', url: '/upload', data: formData, processData: false, contentType: false, success: function(data) { alert(data); } }); });
在后端代码中,我们需要使用flask框架的session对象来保存上传文件的状态和进度信息。代码如下所示:
from flask import Flask, request, session from werkzeug.utils import secure_filename import os app = Flask(__name__) app.config['UPLOAD_FOLDER'] = './uploads' app.config['ALLOWED_EXTENSIONS'] = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif']) app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 app.secret_key = 'secret key' def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS'] @app.route('/upload', methods=['POST']) def upload_file(): file = request.files['file'] if file and allowed_file(file.filename): filename = secure_filename(file.filename) file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) if os.path.exists(file_path): session['upload_status'] = 'complete' return 'upload success!' else: if not session.get('upload_status'): session['upload_status'] = 'in progress' session['upload_size'] = 0 file.save(file_path) session['upload_size'] += os.path.getsize(file_path) return str(session['upload_size']) else: return 'file type not allowed!' if __name__ == '__main__': app.run()
上述代码中,我们使用session对象来保存上传文件的状态和进度信息。首先,判断上传的文件是否已经存在于文件夹中,如果是,则直接返回成功信息。如果不是,则判断session中是否保存了上传状态。如果没有保存,则说明上传开始,创建新的session对象,并将上传状态设置为' in progress'。如果已经保存了,则说明上传已经开始,继续向文件中写入数据,并累加上传进度信息。最后,将上传进度以字符串形式返回给前端页面。