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函数中定义参数的四种方式
Nov 30 Python
为Python的web框架编写前端模版的教程
Apr 30 Python
python实现根据主机名字获得所有ip地址的方法
Jun 28 Python
详解python单例模式与metaclass
Jan 15 Python
Python3.6日志Logging模块简单用法示例
Jun 14 Python
python一行sql太长折成多行并且有多个参数的方法
Jul 19 Python
Python用Try语句捕获异常的实例方法
Jun 26 Python
opencv3/C++实现视频背景去除建模(BSM)
Dec 11 Python
基于Python生成个性二维码过程详解
Mar 05 Python
python实现FTP循环上传文件
Mar 20 Python
python中pdb模块实例用法
Jan 15 Python
Python实现简单得递归下降Parser
May 02 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
了解咖啡雨林联盟认证 什么是雨林认证 雨林认证是什么意思
2021/03/05 新手入门
用sql命令修改数据表中的一个字段为非空(not null)的语句
2010/06/04 PHP
PHP循环语句笔记(foreach,list)
2011/11/29 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
2015/08/23 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
JavaScript与函数式编程解释
2007/04/27 Javascript
基于jquery的仿百度的鼠标移入图片抖动效果
2010/09/17 Javascript
JS实现拖动示例代码
2013/11/01 Javascript
javascript带回调函数的异步脚本载入方法实例分析
2015/07/02 Javascript
7个jQuery最佳实践
2016/01/12 Javascript
最全的Javascript编码规范(推荐)
2016/06/22 Javascript
简单实现js页面切换功能
2021/01/10 Javascript
vue双向绑定的简单实现
2016/12/22 Javascript
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
史上最为详细的javascript继承(推荐)
2019/05/18 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
Nuxt.js nuxt-link与router-link的区别说明
2020/11/06 Javascript
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
python简单的函数定义和用法实例
2015/05/07 Python
Python提取网页中超链接的方法
2016/09/18 Python
Python使用三种方法实现PCA算法
2017/12/12 Python
Python with语句上下文管理器两种实现方法分析
2018/02/09 Python
django manage.py扩展自定义命令方法
2018/05/27 Python
对Django项目中的ORM映射与模糊查询的使用详解
2019/07/18 Python
numpy实现神经网络反向传播算法的步骤
2019/12/24 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
2020/03/19 Python
网站性能延迟加载图像的五种技巧(小结)
2020/08/13 HTML / CSS
AmazeUI的下载配置与Helloworld的实现
2020/08/19 HTML / CSS
New Balance波兰官方商城:始于1906年,百年慢跑品牌
2017/08/15 全球购物
goodhealth官方海外旗舰店:新西兰国民营养师
2017/12/15 全球购物
播音主持专业个人自我评价
2014/01/09 职场文书
进口业务员岗位职责
2014/04/06 职场文书
2014年学校法制宣传日活动总结
2014/11/01 职场文书
妇产科护理心得体会
2016/01/22 职场文书
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers