Flask Web开发入门之文件上传(八)


Posted in Python onAugust 17, 2018

本章我们介绍Flask Web开发中涉及的文件上传模块

定义后台接收处理逻辑

# http://flask.pocoo.org/docs/0.12/patterns/fileuploads/
@app.route('/upload', methods=['POST'])
def upload_file():
  if request.method == 'POST':
    # check if the post request has the file part
    if 'file' not in request.files:
      logger.debug('No file part')
      return jsonify({'code': -1, 'filename': '', 'msg': 'No file part'})
    file = request.files['file']
    # if user does not select file, browser also submit a empty part without filename
    if file.filename == '':
      logger.debug('No selected file')
      return jsonify({'code': -1, 'filename': '', 'msg': 'No selected file'})
    else:
      try:
        if file and allowed_file(file.filename):
          origin_file_name = file.filename
          logger.debug('filename is %s' % origin_file_name)
          # filename = secure_filename(file.filename)
          filename = origin_file_name

          if os.path.exists(UPLOAD_PATH):
            logger.debug('%s path exist' % UPLOAD_PATH)
            pass
          else:
            logger.debug('%s path not exist, do make dir' % UPLOAD_PATH)
            os.makedirs(UPLOAD_PATH)

          file.save(os.path.join(UPLOAD_PATH, filename))
          logger.debug('%s save successfully' % filename)
          return jsonify({'code': 0, 'filename': origin_file_name, 'msg': ''})
        else:
          logger.debug('%s not allowed' % file.filename)
          return jsonify({'code': -1, 'filename': '', 'msg': 'File not allowed'})
      except Exception as e:
        logger.debug('upload file exception: %s' % e)
        return jsonify({'code': -1, 'filename': '', 'msg': 'Error occurred'})
  else:
    return jsonify({'code': -1, 'filename': '', 'msg': 'Method not allowed'})

判定文件类型

def allowed_file(filename):
  return '.' in filename and \
      filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

前台页面代码

<div class="layui-inline">
      <label class="layui-form-label">上传文件</label>
 <div class="layui-input-inline">
   <input type="text" name="attach" id="upload_message" lay-verify="required" autocomplete="off"
   class="layui-input" readonly="readonly">
 </div>
</div>
<div class="layui-inline">
   <img id='img_delete' src="{{ url_for('static', filename='images/delete.png')}}" onclick="do_delete()"
     style="display: none;">
   <button type="button" class="layui-btn" id="upload"><i class="layui-icon"></i>上传文件</button>

</div>

上传按钮初始化及回调

layui.use(['upload', 'layer'], function () {
    var upload = layui.upload;
    var layer = layui.layer;
    upload.render({
      elem: '#upload'
      , url: '/upload'
      , accept: 'file'
      , exts: 'txt'
      , size: 2048
      , done: function (res) {
        console.log(res);
        if (res.code === 0) {
          layer.msg(res.filename + '上传成功');
          $("#upload_message").val(res.filename);
          $("#img_delete").show()
        } else {
          layer.alert('上传失败');
          $("#upload_message").val('上传失败!');
        }
      }
    });
})

当然允许上传,同时也应该允许对以删除文件进行删除

@app.route('/delete', methods=['GET'])
def delete_file():
  if request.method == 'GET':
    filename = request.args.get('filename')
    timestamp = request.args.get('timestamp')
    logger.debug('delete file : %s, timestamp is %s' % (filename, timestamp))
    try:
      fullfile = os.path.join(UPLOAD_PATH, filename)

      if os.path.exists(fullfile):
        os.remove(fullfile)
        logger.debug("%s removed successfully" % fullfile)
        return jsonify({'code': 0, 'msg': ''})
      else:
        return jsonify({'code': -1, 'msg': 'File not exist'})

    except Exception as e:
      logger.debug("delete file error %s" % e)
      return jsonify({'code': -1, 'msg': 'File deleted error'})

  else:
    return jsonify({'code': -1, 'msg': 'Method not allowed'})

删除按钮初始化及回调处理

function do_delete() {
    var filename = $("#upload_message").val();
    layui.use(['upload', 'layer'], function () {
      var layer = layui.layer;
      $.ajax({
        url: '/delete?filename=' + filename + "×tamp=" + new Date().getTime()
        , type: 'GET'
        , success: function (response) {
          console.log(response)
          if (response.code == 0) {
            layer.msg('"' + filename + '"删除成功!');
            $("#upload_message").val('')
            $("img_delete").hide()
          } else {
            layer.msg('"' + filename + '"删除失败!');
          }
        }
      })
    })
  }

实现效果

Flask Web开发入门之文件上传(八)

源码参考:flask-sqlalchemy-web   

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python基础入门之seed()方法的使用
May 15 Python
Python实现递归遍历文件夹并删除文件
Apr 18 Python
Python实现二维有序数组查找的方法
Apr 27 Python
python目录与文件名操作例子
Aug 28 Python
python pandas修改列属性的方法详解
Jun 09 Python
Python爬虫框架Scrapy基本用法入门教程
Jul 26 Python
详解python实现识别手写MNIST数字集的程序
Aug 03 Python
Python supervisor强大的进程管理工具的使用
Apr 24 Python
关于Python3 类方法、静态方法新解
Aug 30 Python
基于h5py的使用及数据封装代码
Dec 26 Python
python用Tkinter做自己的中文代码编辑器
Sep 07 Python
django inspectdb 操作已有数据库数据的使用步骤
Feb 07 Python
python操作excel的方法
Aug 16 #Python
python3调用百度翻译API实现实时翻译
Aug 16 #Python
Python用于学习重要算法的模块pygorithm实例浅析
Aug 16 #Python
Python pygorithm模块用法示例【常见算法测试】
Aug 16 #Python
Python使用pickle模块报错EOFError Ran out of input的解决方法
Aug 16 #Python
Python使用pickle模块储存对象操作示例
Aug 15 #Python
Linux下多个Python版本安装教程
Aug 15 #Python
You might like
PHP垃圾回收机制简单说明
2010/07/22 PHP
php设计模式  Command(命令模式)
2011/06/17 PHP
单点登录 Ucenter示例分析
2013/10/29 PHP
PHP获取网页标题的3种实现方法代码实例
2014/04/11 PHP
PHP中的reflection反射机制测试例子
2014/08/05 PHP
ThinkPHP中公共函数路径和配置项路径的映射分析
2014/11/22 PHP
经验几则 推荐
2006/09/05 Javascript
JS 无法通过W3C验证的处理方法
2010/03/09 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
2013/07/05 Javascript
js防止页面被iframe调用的方法
2014/10/30 Javascript
jQuery中:last选择器用法实例
2014/12/30 Javascript
JS实现双击编辑可修改状态的方法
2015/08/14 Javascript
深入学习 JavaScript中的函数调用
2017/03/23 Javascript
SpringMVC+bootstrap table实例详解
2017/06/02 Javascript
详解angular应用容器化部署
2018/08/14 Javascript
JavaScript读写二进制数据的方法详解
2018/09/09 Javascript
js+css3实现炫酷时钟
2020/08/18 Javascript
Vue 打包的静态文件不能直接运行的原因及解决办法
2020/11/19 Vue.js
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
浅谈Python中的bs4基础
2018/10/21 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
python tkinter实现彩球碰撞屏保
2019/07/30 Python
python 单线程和异步协程工作方式解析
2019/09/28 Python
使用TensorFlow搭建一个全连接神经网络教程
2020/02/06 Python
Jupyter Notebook添加代码自动补全功能的实现
2021/01/07 Python
CSS3 animation实现简易幻灯片轮播特效
2016/09/27 HTML / CSS
canvas实现手机的手势解锁的步骤详细
2020/03/16 HTML / CSS
美国知名的女性服饰品牌:LOFT(洛芙特)
2016/08/05 全球购物
美国网上花店:JustFlowers
2017/02/12 全球购物
集团财务总监岗位职责
2015/04/03 职场文书
公司表扬信格式
2015/05/04 职场文书
大学生创业计划书
2019/06/24 职场文书
《哪吒之魔童降世》观后感:世上哪有随随便便的成功
2019/11/08 职场文书
实习员工转正的评语汇总,以备不时之需
2019/12/17 职场文书
如何将JavaScript将数组转为树形结构
2021/06/02 Javascript