基于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获取GY-85九轴模块信息示例
Dec 05 Python
讲解Python中for循环下的索引变量的作用域
Apr 15 Python
Python自定义线程类简单示例
Mar 23 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
[原创]Python入门教程4. 元组基本操作
Oct 31 Python
python web自制框架之接受url传递过来的参数实例
Dec 17 Python
PyQt5 对图片进行缩放的实例
Jun 18 Python
Django 迁移、操作数据库的方法
Aug 02 Python
Python列表list常用内建函数实例小结
Oct 22 Python
Python django框架开发发布会签到系统(web开发)
Feb 12 Python
django处理select下拉表单实例(从model到前端到post到form)
Mar 13 Python
python自动化发送邮件实例讲解
Jan 04 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编程最快明白》第三讲:php数组
2010/11/01 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
基于Jquery的实现回车键Enter切换焦点
2010/09/14 Javascript
js跑马灯代码(自写)
2013/04/17 Javascript
Javascript 实现的数独解题算法网页实例
2013/10/15 Javascript
JavaScript获取页面中超链接数量的方法
2015/11/09 Javascript
jquery操作select元素和option的实例代码
2016/02/03 Javascript
纯JavaScript手写图片轮播代码
2016/10/20 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
2017/02/10 Javascript
基于JavaScript实现瀑布流效果
2017/03/29 Javascript
vue 设置proxyTable参数进行代理跨域
2018/04/09 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
js获取 gif 的帧数的代码实例
2019/09/10 Javascript
js实现ajax的用户简单登入功能
2020/06/18 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
[54:58]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第一场 11.25
2020/11/25 DOTA
Python中使用partial改变方法默认参数实例
2015/04/28 Python
在Python中使用zlib模块进行数据压缩的教程
2015/06/26 Python
Python根据当前日期取去年同星期日期
2019/04/14 Python
python 实现创建文件夹和创建日志文件的方法
2019/07/07 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
2020/07/13 Python
利用CSS3实现平移动画效果示例代码
2016/10/12 HTML / CSS
意大利领先的线上奢侈品销售电商:Eleonora Bonucci
2017/10/17 全球购物
上班离岗检讨书
2014/01/27 职场文书
物流专业求职信
2014/06/30 职场文书
转让协议书范本
2014/09/13 职场文书
教育实习指导教师评语
2014/12/31 职场文书
上帝也疯狂观后感
2015/06/09 职场文书
清明扫墓感想
2015/08/11 职场文书
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL
永中文档在线转换预览基于nginx配置部署方案
2022/06/10 Servers