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语言技巧之三元运算符使用介绍
Mar 04 Python
Python 'takes exactly 1 argument (2 given)' Python error
Dec 13 Python
使用Python的Scrapy框架十分钟爬取美女图
Dec 26 Python
浅谈Python Opencv中gamma变换的使用详解
Apr 02 Python
详解PyTorch批训练及优化器比较
Apr 28 Python
matplotlib savefig 保存图片大小的实例
May 24 Python
python实现点对点聊天程序
Jul 28 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
Mar 05 Python
利用Python查看微信共同好友功能的实现代码
Apr 24 Python
Python用Try语句捕获异常的实例方法
Jun 26 Python
django 实现celery动态设置周期任务执行时间
Nov 19 Python
python开根号实例讲解
Aug 30 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
2020显卡排行榜天梯图 显卡天梯图2020年3月最新版
2020/04/02 数码科技
深思 PHP 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
Java和PHP在Web开发方面对比分析
2015/03/01 PHP
PHP如何通过AJAX方式实现登录功能
2015/11/23 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
2016/02/15 PHP
PHP封装的非对称加密RSA算法示例
2018/05/28 PHP
ajax更新数据后,jquery、jq失效问题
2011/03/16 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
2015/08/13 Javascript
基于javascript代码实现通过点击图片显示原图片
2015/11/29 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
2016/07/22 Javascript
javascript验证香港身份证的格式或真实性
2017/02/07 Javascript
angularjs定时任务的设置与清除示例
2017/06/02 Javascript
前端构建工具之gulp的语法教程
2017/06/12 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
详解如何优雅地在React项目中使用Redux
2017/12/28 Javascript
详解Vue.js自定义tipOnce指令用法实例
2018/12/19 Javascript
Vue中Table组件Select的勾选和取消勾选事件详解
2019/03/19 Javascript
前端开发基础javaScript的六大作用
2020/08/06 Javascript
手把手教你如何编译打包video.js
2020/12/09 Javascript
Python实例分享:快速查找出被挂马的文件
2014/06/08 Python
跟老齐学Python之关于类的初步认识
2014/10/11 Python
python使用装饰器和线程限制函数执行时间的方法
2015/04/18 Python
python实现复制整个目录的方法
2015/05/12 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
python paramiko利用sftp上传目录到远程的实例
2019/01/03 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
如何在sublime编辑器中安装python
2020/05/20 Python
购买正版游戏和游戏激活码:Green Man Gaming
2019/11/06 全球购物
易程科技软件测试笔试
2013/03/24 面试题
领导干部培训感言
2014/01/23 职场文书
计算机学生求职信范文
2014/01/30 职场文书
国家助学金获奖感言
2014/01/31 职场文书
创建青年文明号材料
2014/05/09 职场文书
乡镇干部先进性教育活动个人整改措施
2014/09/16 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
生产现场禁烟通知
2015/04/23 职场文书