代码:

1. HTML

<div>
	<input type="file" name="FileUpload" id="FileUpload">
	<a class="layui-btn layui-btn-mini" id="btn_uploadimg">上传图片</a>
</div>

2. Ajax实现

<script type="text/jscript">
    var csrftoken = "{{ csrf_token() }}"
    $.ajaxSetup({
        beforeSend: function (xhr, settings) {
            if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
                xhr.setRequestHeader("X-CSRFToken", csrftoken)
            }
        }
    })

    $(function () {
        $("#btn_uploadimg").click(function () {
            var fileObj = document.getElementById("FileUpload").files[0]; // js 获取文件对象
            if (typeof (fileObj) == "undefined" || fileObj.size <= 0) {
                alert("请选择图片");
                return;
            }
            var formFile = new FormData();
            formFile.append("action", "UploadVMKImagePath");  
            formFile.append("file", fileObj); //加入文件对象

            //第一种 XMLHttpRequest 对象
            //var xhr = new XMLHttpRequest();
            //xhr.open("post", "/Admin/Ajax/VMKHandler.ashx", true);
            //xhr.onload = function () {
            // alert("上传完成!");
            //};
            //xhr.send(formFile);

            //第二种 ajax 提交

            var form_data = formFile;
            $.ajax({
                url: "/upload/",
                data: form_data,
                type: "post",
                dataType: "json",
                cache: false,//上传文件无需缓存
                processData: false,//用于对data参数进行序列化处理 这里必须false
                contentType: false, //必须
                success: function (result) {
                    alert("上传完成!");
                },
            })
        })
    })
 
 </script>

3. 后台Flask

from flask import Flask,render_template,request,redirect,url_for
from werkzeug.utils import secure_filename
import os
from flask import send_from_directory
from werkzeug import SharedDataMiddleware

UPLOAD_FOLDER = '/uploads'  #文件存放路径
ALLOWED_EXTENSIONS = set(['jpg']) #限制上传文件格式

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['MAX_CONTENT_LENGTH'] = 5 * 1024 * 1024
def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS


@app.route('/upload/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        # check if the post request has the file part
        if 'file' not in request.files:
            flash('No file part')
            return redirect(request.url)
        file = request.files['file']
        # if user does not select file, browser also
        # submit an empty part without filename
        if file.filename == '':
            flash('No selected file')
            return redirect(request.url)
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            return  '{"filename":"%s"}' % filename
    return ''

以上基本上就可以实现上传功能了。

参考:

  1. Ajax+Python flask实现上传文件功能
  2. Flask实现图片的上传、下载及展示
  3. flask实现图片上传
  4. Python文件上传功能简单实现
  5. WEB的文件上传实现
  6. python – 使用Flask上传文件夹/文件
  7. flask 文件上传
  8. jQuery prop() 方法
  9. 选择文件,通过ajax方式传递选择的文件,后端使用controller接受
  10. 用AJAX异步提交表单上传多个文件(type=‘file‘)案例
  11. FormData 对象的使用
  12. 通过jQuery Ajax使用FormData对象上传文件
  13. 使用ajax提交form表单,包括ajax文件上传
  14. 通过Ajax方式上传文件,使用FormData进行Ajax请求
  15. HTML5+Ajax上传文件
  16. Ajax提交Form数据及文件上传
  17. 使用jQuery Ajax异步上传文件方法总结
  18. ajax上传文件是怎么实现的
  19. 通过new FormData对象异步上传文件
  20. python学习-Flask使用ajax进行前后端交互
  21. 前端与后端的数据交互(jquery ajax+python flask)
  22. 前后端json数据发送和接收
  23. ajax实现文件上传 使用FormData进行Ajax请求
  24. ajax如何上传文件(整理)
  25. 通过Ajax方式上传文件(input file),使用FormData进行Ajax请求
  26. AJAX请求 $.ajaxSetup方法的使用