基于django和dropzone.js实现上传文件


Posted in Python onNovember 24, 2020

1、dropzone.js

http://www.dropzonejs.com/

dropzone.js是一个可预览\可定制化的文件拖拽上传,实现AJAX异步上传文件的工具

2、dropzone.js前端界面上传方式

官网下载 并且引入dropzone.js和dropzone.css(http://www.dropzonejs.com/)以及引用jquery.js,定义一个class="dropzone"即可完成,

代码示例:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Flask upload with Dropzone example</title>
  <link rel="stylesheet" href="/static/css/dropzone.css" rel="external nofollow" type="text/css" />
  <script src="/static/js/jquery-3.3.1.js"></script>
  <script src="/static/js/dropzone.js"></script>
</head>
<body>

方法1:

<form id ="myAwesomeDropzone" action="{{ request.path }}" class="dropzone" method="POST" enctype="multipart/form-data"></form>
//这段代码是展示dropzone.js的精髓,class一定要是dropzone,id可以自定义
<script type="text/javascript">
    //第二种配置,这种使用的是div做上传区域时使用的配置
    Dropzone.autoDiscover = false;//不知道该行有什么用,欢迎高手下方评论解答
    $("#myAwesomeDropzone").dropzone({
    url: "{{ request.path }}",
    addRemoveLinks: true,
    method: 'post',
    filesizeBase: 1024
    });
</script>

方法2:

<div class="form-group">
  <label class="title">真人照(最多只能传一张)</label>
  <div id="dropz" class="dropzone"></div>//这段代码是展示dropzone.js的精髓,class一定要是dropzone,id可以自定义
</div>
<input type="hidden" name="file_id" ng-model="file_id" id="file_id"/>

<script type="text/javascript">
var appElement = document.querySelector('div .inmodal');
  var myDropzone = new Dropzone("#dropz", {
    url: "{{ request.path }}",//文件提交地址
    method:"post", //也可用put
    paramName:"file", //默认为file
    maxFiles:1,//一次性上传的文件数量上限
    maxFilesize: 2, //文件大小,单位:MB
    acceptedFiles: ".jpg,.gif,.png,.jpeg", //上传的类型
    addRemoveLinks:true,
    parallelUploads: 1,//一次上传的文件数量
    //previewsContainer:"#preview",//上传图片的预览窗口
    dictDefaultMessage:'拖动文件至此或者点击上传',
    dictMaxFilesExceeded: "您最多只能上传1个文件!",
    dictResponseError: '文件上传失败!',
    dictInvalidFileType: "文件类型只能是*.jpg,*.gif,*.png,*.jpeg。",
    dictFallbackMessage:"浏览器不受支持",
    dictFileTooBig:"文件过大上传文件最大支持.",
    dictRemoveLinks: "删除",
    dictCancelUpload: "取消",
    //对一些方法的后续处理
    init:function(){
      this.on("addedfile", function(file) {
        //上传文件时触发的事件
        document.querySelector('div .dz-default').style.display = 'none';
      });
      this.on("success",function(file,data){
        alert(data.data)
        //上传成功触发的事件
        console.log('ok');
      });
      this.on("error",function (file,data) {
        //上传失败触发的事件
        console.log('fail');
        var message = '';
        //lavarel框架有一个表单验证,
        //对于ajax请求,JSON 响应会发送一个 422 HTTP 状态码,
        //对应file.accepted的值是false,在这里捕捉表单验证的错误提示
        if (file.accepted){
          $.each(data,function (key,val) {
            message = message + val[0] + ';';
          })
          //控制器层面的错误提示,file.accepted = true的时候;
          alert(message);
        }
      });
      this.on("removedfile",function(file){
        //删除文件时触发的方法(向后台发送删除文件请求)
{#        $.post('/admin/del/'+ file_id,{'_method':'DELETE'},function (data) {#}
{#          console.log('删除结果:'+data.message);#}
{#        })#}

        document.querySelector('div .dz-default').style.display = 'block';
      });
    }
  });
</script>
</body>
</html>

方法二中,很多参数是不一定需要定义的,参见方法一

3、后台处理dropzone.js前端界面上传的文件

A、django的settings.py 文件定义上传文件夹:

#文件上传文件夹定义
ENROLLED_DATA = '%s/statics/enrolled_data' %BASE_DIR

B、对应的view处理前端上传过来的数据:

from django.views.decorators.csrf import csrf_exempt
from PerfectCRM.settings import *
import os
@csrf_exempt
def upload(request):
  if request.method =='POST': #post方式
    if request.is_ajax():  #如果是ajax请求
      if not os.path.exists(ENROLLED_DATA): #如果settings定义的 上传文件夹不存在
        os.makedirs(ENROLLED_DATA,exist_ok=True) #新建文件夹
      for k,file_obj in request.FILES.items(): #获取前端传过来的文件数据
        with open('%s/%s'%(ENROLLED_DATA,file_obj.name),"wb") as f: #打开文件
          for chunk in file_obj.chunks():   
            f.write(chunk)  #chunk方式写入文件
  return render(request, 'dropzone-back.html')

C、上传成功:

基于django和dropzone.js实现上传文件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
跟老齐学Python之从格式化表达式到方法
Sep 28 Python
详解Python Socket网络编程
Jan 05 Python
Python的string模块中的Template类字符串模板用法
Jun 27 Python
基于Python List的赋值方法
Jun 23 Python
python3 flask实现文件上传功能
Mar 20 Python
django连接mysql配置方法总结(推荐)
Aug 18 Python
python使用rpc框架gRPC的方法
Aug 24 Python
对Python random模块打乱数组顺序的实例讲解
Nov 08 Python
python 发送和接收ActiveMQ消息的实例
Jan 30 Python
简单了解python中的f.b.u.r函数
Nov 02 Python
Python smtp邮件发送模块用法教程
Jun 15 Python
Python从文件中读取数据的方法步骤
Nov 18 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
Nov 24 #Python
Django web自定义通用权限控制实现方法
Nov 24 #Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
Nov 24 #Python
Pycharm安装python库的方法
Nov 24 #Python
python opencv角点检测连线功能的实现代码
Nov 24 #Python
python+appium+yaml移动端自动化测试框架实现详解
Nov 24 #Python
Python利用myqr库创建自己的二维码
Nov 24 #Python
You might like
PHP将整个网站生成HTML纯静态网页的方法总结
2012/02/05 PHP
PHP运行环境配置与开发环境的配置(图文教程)
2013/06/04 PHP
PHP导航下拉菜单的实现如此简单
2013/09/22 PHP
js cookies实现简单统计访问次数
2009/11/24 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
使用javascript为网页增加夜间模式
2014/01/26 Javascript
js获取 type=radio 值的方法
2014/05/09 Javascript
javascript原型链继承用法实例分析
2015/01/28 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
2015/09/12 Javascript
jQuery实现只允许输入数字和小数点的方法
2016/03/02 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
2016/11/25 Javascript
利用jquery去掉时光轴头尾部线条的方法实例
2017/06/16 jQuery
浅析vue.js数组的变异方法
2018/06/30 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
2018/07/24 jQuery
Electron 调用命令行(cmd)
2019/09/23 Javascript
浅谈vuex中store的命名空间
2019/11/08 Javascript
[01:33:59]真人秀《加油 DOTA》 第六期
2014/09/09 DOTA
使用python实现递归版汉诺塔示例(汉诺塔递归算法)
2014/04/08 Python
Python中基本的日期时间处理的学习教程
2015/10/16 Python
详解Python中contextlib上下文管理模块的用法
2016/06/28 Python
Python字符串逆序输出的实例讲解
2019/02/16 Python
解决python多行注释引发缩进错误的问题
2019/08/23 Python
关于python中plt.hist参数的使用详解
2019/11/28 Python
Pytorch 保存模型生成图片方式
2020/01/10 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
通过代码实例解析Pytest运行流程
2020/08/20 Python
详解Python调用系统命令的六种方法
2021/01/28 Python
Canvas实现保存图片到本地的示例代码
2018/06/28 HTML / CSS
汤米巴哈马官方网站:Tommy Bahama
2017/05/13 全球购物
莫斯科制造商的廉价皮大衣:Fursk
2020/06/09 全球购物
学生会离职感言
2014/02/11 职场文书
文明家庭事迹材料
2014/12/20 职场文书
五好家庭事迹材料
2014/12/20 职场文书
小学美术教学反思
2016/02/17 职场文书
公文写作:新员工转正申请书范本3篇!
2019/08/07 职场文书
使用Pytorch训练two-head网络的操作
2021/05/28 Python