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 相关文章推荐
python33 urllib2使用方法细节讲解
Dec 03 Python
python中文编码问题小结
Sep 28 Python
详解Python中的各种函数的使用
May 24 Python
Python之日期与时间处理模块(date和datetime)
Feb 16 Python
Python使用剪切板的方法
Jun 06 Python
Python编程求解二叉树中和为某一值的路径代码示例
Jan 04 Python
浅谈使用Python内置函数getattr实现分发模式
Jan 22 Python
pandas DataFrame实现几列数据合并成为新的一列方法
Jun 08 Python
pygame游戏之旅 添加键盘按键的方法
Nov 20 Python
python 实现让字典的value 成为列表
Dec 16 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
Mar 09 Python
Python find()、rfind()方法及作用
Dec 24 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性能测试工具xhprof的详解
2013/06/03 PHP
PHP实现递归无限级分类
2015/10/22 PHP
php图片添加文字水印实现代码
2016/03/15 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
一个简单的js动画效果代码
2010/07/20 Javascript
jQuery EasyUI API 中文文档 - ComboTree组合树
2011/10/11 Javascript
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
2013/11/05 Javascript
JavaScript对象的property属性详解
2014/04/01 Javascript
我的Node.js学习之路(二)NPM模块管理
2014/07/06 Javascript
DOM节点删除函数removeChild()用法实例
2015/01/12 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
使用Script元素发送JSONP请求的方法
2016/06/12 Javascript
AngularJS基础 ng-repeat 指令简单示例
2016/08/03 Javascript
浅谈JS使用[ ]来访问对象属性
2016/09/21 Javascript
JS获取年月日时分秒的方法分析
2016/11/28 Javascript
使用angular帮你实现拖拽的示例
2017/07/05 Javascript
js+html5生成自动排列对话框实例
2017/10/09 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
纯JS实现出生日期[年月日]下拉菜单效果
2018/06/01 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解
2019/01/18 Javascript
仿ElementUI实现一个Form表单的实现代码
2019/04/23 Javascript
对python numpy数组中冒号的使用方法详解
2018/04/17 Python
python excel使用xlutils类库实现追加写功能的方法
2018/05/02 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
假日旅行社实习自我鉴定
2013/09/24 职场文书
自动化专业个人求职信范文
2013/11/29 职场文书
2014卖家双十一活动策划书
2014/09/29 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
上班迟到检讨书范文
2015/05/06 职场文书
战马观后感
2015/06/08 职场文书
导游词之太原天龙山
2020/01/02 职场文书
详解NodeJS模块化
2021/06/15 NodeJs
利用js实现简单开关灯代码
2021/11/23 Javascript
Docker与K8s关系介绍不会Docker也可以使用K8s
2022/06/25 Servers