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 相关文章推荐
Android分包MultiDex策略详解
Oct 30 Python
Python3使用TCP编写一个简易的文件下载器功能
May 08 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
May 13 Python
pytz格式化北京时间多出6分钟问题的解决方法
Jun 21 Python
Python实现性能自动化测试竟然如此简单
Jul 30 Python
Python pandas自定义函数的使用方法示例
Nov 20 Python
Python实现随机生成任意数量车牌号
Jan 21 Python
python实现ftp文件传输系统(案例分析)
Mar 20 Python
获取python运行输出的数据并解析存为dataFrame实例
Jul 07 Python
Python压缩模块zipfile实现原理及用法解析
Aug 14 Python
Python3利用openpyxl读写Excel文件的方法实例
Feb 03 Python
Flask使用SQLAlchemy实现持久化数据
Jul 16 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
ThinkPHP中使用ajax接收json数据的方法
2014/12/18 PHP
php+xml实现在线英文词典之添加词条的方法
2015/01/23 PHP
PHP生成树的方法
2015/07/28 PHP
php使用正则验证中文
2016/04/06 PHP
php7 新增功能实例总结
2020/05/25 PHP
IE7提供XMLHttpRequest对象为兼容
2007/03/08 Javascript
javascript实现网页背景烟花效果的方法
2015/08/06 Javascript
基于jquery实现在线选座订座之影院篇
2015/08/24 Javascript
浅谈javascript中replace()方法
2015/11/10 Javascript
js实现华丽的九九乘法表效果
2017/03/29 Javascript
nodejs入门教程四:URL相关模块用法分析
2017/04/24 NodeJs
JS实现微信里判断页面是否被分享成功的方法
2017/06/06 Javascript
原JS实现banner图的常用功能
2017/06/12 Javascript
webpack3之loader全解析
2017/10/26 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
JavaScript实现秒杀时钟倒计时
2019/09/29 Javascript
JavaScript中this的学习笔记及用法整理
2020/02/17 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
2020/08/04 Javascript
element el-table表格的二次封装实现(附表格高度自适应)
2021/01/19 Javascript
Python实现基于权重的随机数2种方法
2015/04/28 Python
Python创建普通菜单示例【基于win32ui模块】
2018/05/09 Python
如何使用Python实现自动化水军评论
2019/06/26 Python
如何关掉pycharm中的python console(图解)
2019/10/31 Python
Python替换NumPy数组中大于某个值的所有元素实例
2020/06/08 Python
美国著名的户外用品品牌:L.L.Bean
2018/01/05 全球购物
Nili Lotan官网:Nili Lotan同名品牌
2018/01/07 全球购物
Magee 1866官网:Donegal粗花呢外套和大衣专家
2019/11/01 全球购物
sort命令的作用和用法
2012/11/04 面试题
社区工作感言
2014/02/21 职场文书
后备干部培训方案
2014/05/22 职场文书
公司经理任命书
2014/06/05 职场文书
文明倡议书
2015/01/19 职场文书
小学数学继续教育研修日志
2015/11/13 职场文书
Python first-order-model实现让照片动起来
2022/06/25 Python
windows系统安装配置nginx环境
2022/06/28 Servers
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技