基于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 set集合类型操作总结
Nov 07 Python
django模型中的字段和model名显示为中文小技巧分享
Nov 18 Python
Python脚本处理空格的方法
Aug 08 Python
python使用PyCharm进行远程开发和调试
Nov 02 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
Jan 19 Python
Pandas之排序函数sort_values()的实现
Jul 09 Python
Python values()与itervalues()的用法详解
Nov 27 Python
如何基于python实现脚本加密
Dec 28 Python
Python sqlite3查询操作过程解析
Feb 20 Python
Pytorch 使用 nii数据做输入数据的操作
May 26 Python
Python paramiko使用方法代码汇总
Nov 20 Python
Python数据分析之pandas函数详解
Apr 21 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
比特率,大家看看这个就不用收音机音质去比MP3音质了
2021/03/01 无线电
php实现的短网址算法分享
2014/06/20 PHP
采用memcache在web集群中实现session的同步会话
2014/07/05 PHP
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
2011/02/14 Javascript
Javascript 颜色渐变效果的实现代码
2013/10/01 Javascript
JavaScript中创建对象和继承示例解读
2014/02/12 Javascript
jquery实现浮动的侧栏实例
2015/06/25 Javascript
JavaScript中数组去除重复的三种方法
2016/04/22 Javascript
基于jQuery实现的幻灯图片切换
2016/12/02 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
NodeJs模拟登陆正方教务
2017/04/28 NodeJs
Easy UI动态树点击文字实现展开关闭功能
2017/09/30 Javascript
JavaScript实现封闭区域布尔运算的示例代码
2018/06/25 Javascript
Vue CLI3搭建的项目中路径相关问题的解决
2018/09/17 Javascript
nvm、nrm、npm 安装和使用详解(小结)
2019/01/17 Javascript
js实现左右轮播图
2020/01/09 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
[01:45]绝对公平!DOTA2队长征召模式详解
2014/04/25 DOTA
[01:35]2014DOTA2西雅图邀请赛 专访狐狸妈青春献给刀塔
2014/07/08 DOTA
python和C语言混合编程实例
2014/06/04 Python
Python实现类继承实例
2014/07/04 Python
python matplotlib画图实例代码分享
2017/12/27 Python
在scrapy中使用phantomJS实现异步爬取的方法
2018/12/17 Python
python requests指定出口ip的例子
2019/07/25 Python
Python猜数字算法题详解
2020/03/01 Python
Python使用xlrd实现读取合并单元格
2020/07/09 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
自立自强的名人事例
2014/02/10 职场文书
工程力学专业自荐信范文
2014/03/17 职场文书
《四季》教学反思
2014/04/08 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
2014年护士工作总结范文
2014/11/11 职场文书
教师个人事迹材料
2014/12/17 职场文书
龙门石窟导游词
2015/02/02 职场文书
教师纪律作风整顿心得体会
2016/01/23 职场文书
用Python将GIF动图分解成多张静态图片
2021/06/11 Python