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解析发往本机的数据包示例 (解析数据包)
Jan 16 Python
Python中暂存上传图片的方法
Feb 18 Python
基于Django filter中用contains和icontains的区别(详解)
Dec 12 Python
对numpy中数组转置的求解以及向量内积计算方法
Oct 31 Python
详解Python_shutil模块
Mar 15 Python
python向字符串中添加元素的实例方法
Jun 28 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
Jul 11 Python
OpenCV中VideoCapture类的使用详解
Feb 14 Python
TensorBoard 计算图的查看方式
Feb 15 Python
详解python datetime模块
Aug 17 Python
python如何写个俄罗斯方块
Nov 06 Python
Python 转移文件至云对象存储的方法
Feb 07 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中unlink()、mkdir()、rmdir()等方法的使用介绍
2012/12/21 PHP
利用PHP如何实现Socket服务器
2015/09/23 PHP
PHP读取大文件的几种方法介绍
2016/10/27 PHP
PHP生成加减算法方式的验证码实例
2018/03/12 PHP
弹出广告特效代码(一个IP只弹出一次)
2007/05/11 Javascript
js返回上一页并刷新代码整理
2012/12/21 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
jQuery+PHP打造滑动开关效果
2014/12/16 Javascript
jquery使用经验小结
2015/05/20 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
2016/09/03 Javascript
微信小程序 简单教程实例详解
2017/01/13 Javascript
JS排序之冒泡排序详解
2017/04/08 Javascript
angular实现spa单页面应用实例
2017/07/10 Javascript
Vue-router路由判断页面未登录跳转到登录页面的实例
2017/10/26 Javascript
angular2/ionic2 实现搜索结果中的搜索关键字高亮的示例
2018/08/17 Javascript
详解vue中使用protobuf踩坑记
2019/05/07 Javascript
Vue之beforeEach非登录不能访问的实现(代码亲测)
2019/07/18 Javascript
Angular8基础应用之表单及其验证
2019/08/11 Javascript
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
[01:01:25]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第三局
2016/02/27 DOTA
python 调用win32pai 操作cmd的方法
2017/05/28 Python
Python随机函数random()使用方法小结
2018/04/29 Python
python算法题 链表反转详解
2019/07/02 Python
详细介绍Python进度条tqdm的使用
2019/07/31 Python
在jupyter notebook 添加 conda 环境的操作详解
2020/04/10 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
html5音频_动力节点Java学院整理
2018/08/22 HTML / CSS
泰国在线书店:SE-ED
2020/06/21 全球购物
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
语文教师个人工作总结
2015/02/06 职场文书
第28个世界无烟日活动总结
2015/02/10 职场文书
留学推荐信怎么写
2015/03/26 职场文书
演讲稿:态度决定一切
2019/04/02 职场文书
如何用PHP实现多线程编程
2021/05/26 PHP
tensorflow中的数据类型dtype用法说明
2021/05/26 Python