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使用两种发邮件的方式smtp和outlook示例
Jun 02 Python
详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
Jun 23 Python
python中matplotlib的颜色及线条控制的示例
Mar 16 Python
PyQt5每天必学之像素图控件QPixmap
Apr 19 Python
django获取from表单multiple-select的value和id的方法
Jul 19 Python
详解Python中的正斜杠与反斜杠
Aug 09 Python
复化梯形求积分实例——用Python进行数值计算
Nov 20 Python
Python 静态方法和类方法实例分析
Nov 21 Python
python多进程使用函数封装实例
May 02 Python
python将logging模块封装成单独模块并实现动态切换Level方式
May 12 Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
Sep 20 Python
python 判断一组数据是否符合正态分布
Sep 23 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 中英文混合排版中处理字符串常用的函数
2007/04/12 PHP
利用discuz实现PHP大文件上传应用实例代码
2008/11/14 PHP
PHP 时间转换Unix时间戳代码
2010/01/22 PHP
用PHP实现Ftp用户的在线管理
2012/02/16 PHP
php读取mysql的简单实例
2014/01/15 PHP
php定界符
2014/06/19 PHP
PHP常用技术文之文件操作和目录操作总结
2014/09/27 PHP
浅谈PHP中foreach/in_array的使用
2015/11/02 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
2015/11/15 PHP
在php中设置session用memcache来存储的方法总结
2016/01/14 PHP
微信开发之php表单微信中自动提交两次问题解决办法
2017/01/08 PHP
PHP实现图片批量打包下载功能
2017/03/01 PHP
JQuery中根据属性或属性值获得元素(6种情况获取方法)
2013/01/17 Javascript
javascript中的return和闭包函数浅析
2014/06/06 Javascript
在浏览器中实现图片粘贴的jQuery插件-- pasteimg使用指南
2014/12/29 Javascript
JavaScript使用Prototype实现面向对象的方法
2015/04/14 Javascript
AngularJS实现单独作用域内的数据操作
2016/09/05 Javascript
微信小程序 连续旋转动画(this.animation.rotate)详解
2017/04/07 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
关于Bootstrap按钮组件消除黄框的方法
2017/05/19 Javascript
利用node.js爬取指定排名网站的JS引用库详解
2017/07/25 Javascript
原生js实现移动端Touch轮播图的方法步骤
2019/01/03 Javascript
vuex存取值和映射函数使用说明
2020/07/24 Javascript
python随机模块random使用方法详解
2020/02/14 Python
Python sorted排序方法如何实现
2020/03/31 Python
Python字符串格式化f-string多种功能实现
2020/05/07 Python
python如何将图片转换素描画
2020/09/08 Python
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
瑞典度假品牌:OAS
2019/05/28 全球购物
"引用"与指针的区别是什么
2016/09/07 面试题
人力资源部副职的竞聘演讲稿
2014/01/07 职场文书
商务日语专业的自荐信
2014/05/23 职场文书
人力资源管理系自荐信
2014/05/31 职场文书
招商引资工作汇报
2014/10/28 职场文书
NASA 机智号火星直升机拍到了毅力号设备碎片
2022/04/29 数码科技
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android