DropZone(文件上传插件)
1. html文件
dropzone的原理是模拟表单来上传文件,html中的元素有多重形式。
- 可以建立一个form表单:
123
<form
id
=
"dropz"
action
=
"/upload.php"
enctype
=
"multipart/form-data"
>
<
input
type
=
"file"
name
=
"file"
>
<
/
form>
- 也可以不用表单的形式,直接用一个div
1
<div
id
=
"dropz"
><
/
div>
2.引入css文件
引入dropzone.min.css之后会有更漂亮的外观;
然后可以自己添加些外观样式覆盖它,如:
1 2 3 4 5 6 7 8 9 10 11 12 | <style> #filedropzone{ width: 900px ; height: 220px ; margin - left: 200px ; margin - top: 100px ; border: 3px dashed green; border - radius: 2 % ; box - shadow: 3px 3px 5px #888888; } < / style> |
3.js文件
必须配置js才能上传
1.如果没有引入jquery:
1 | var myDropzone = new Dropzone( "div#mydropzone" , {url: "/upload" }); |
2.如果引入了jquery:
1 | $( "#dropz" ).dropzone({url: "/upload" }) |
常用的配置项:
- url : 必要参数,文件的上传地址;
- maxFiles : 默认为null,可以指定为一个数值,限制最多文件数量。
- maxFilesize : 限制文件的大小,单位是MB;
- acceptedFiles : 允许上传的文件类型,文件扩展名以逗号隔开,格式见实例;
- autoProcessQueue : 默认为true,即拖入文件立即自动上传;如果需要在上传之前有一些选择的操作,然后手动上传,可以把该属性设置为false,然后手动点击按钮上传;
- paramName : 相当于
<input>
元素的name属性,默认为file。
提示文本:
- dictDefaultMessage : 没有任何文件被添加时的提示文本;
- dictFallbackMessage:Fallback 情况下的提示文本。
- dictInvalidInputType:文件类型被拒绝时的提示文本。
- dictFileTooBig:文件大小过大时的提示文本。
- dictCancelUpload:取消上传链接的文本。
- dictCancelUploadConfirmation:取消上传确认信息的文本。
- dictRemoveFile:移除文件链接的文本。
- dictMaxFilesExceeded:超过最大文件数量的提示文本。
添加监听事件:
1 2 3 4 5 6 7 | $( "#dropz" ).dropzone({ init: function() { this.on( "addedfile" , function( file ) { / / actions... }); } }); |
没有添加jquery时:
1 2 3 | dropz.on( "addedfile" , function( file ) { / / actions... }); |
常用事件:
- addedfile : 添加文件是发生
- removefile : 手动从服务器删除文件时发生
- success : 上传成功后发生
- complete:当文件上传成功或失败之后发生。
- canceled:当文件在上传时被取消的时候发生。
- maxfilesreached:当文件数量达到最大时发生。
- maxfilesexceeded:当文件数量超过限制时发生。
- totaluploadprogress : 文件上传中的返回值,第一个参数为总上传进度(0到100),第二个为总字节数,第三个为总上传字节数,利用这几个参数,可计算出上传速度,和剩余上传时间;
html文件demo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | <link rel = "stylesheet" href = "/static/plugins/dropzone/dropzone.css" > <div id = "upload_div" > <p>请上传您的代码(如包含文件夹需要打包后再上传)< / p> <form id = "filedropzone" method = "post" action = "/upload" class = "dropzone dz-clickable" > <div class = "dz-default dz-message" > <div class = "dz-icon icon-wrap icon-circle icon-wrap-md" > <i class = "fa fa-cloud-upload fa-3x" >< / i> < / div> <div> <p class = "dz-text" >把打包后的代码拖放到这里< / p> <p class = "text-muted" >最多可上传 2 张照片< / p> < / div> < / div> < / form> < / div> <script src = "/static/plugins/dropzone/dropzone.js" >< / script> <script> $(document).ready(function () { Dropzone.options.filedropzone = { url: "{{ request.path }}" , paramName: "file" , / / The name that will be used to transfer the file maxFilesize: 1 , / / MB, addRemoveLinks:true, maxFiles: 5 , uploadMultiple:true, accept: function( file , done) { if (! file .name.endsWith( ".zip" ) ) { alert( "只能上传.zip格式的压缩包" ) done( "文件为上传" ) myDropzone.removeFile( file ); } else { done(); } } }; Dropzone.autoDiscover = false; myDropzone = new Dropzone( "#filedropzone" ); myDropzone.on( "addedfile" , function( file ) { / * Maybe display some more file information on your page * / }); myDropzone.on( "success" , function( file ,response) { / * Maybe display some more file information on your page * / console.log( 'filex upload done...' , response); } ) }) < / script> |
完整示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | $( "#dropz" ).dropzone({ url: "/files/uploading" , maxFiles: 1 , maxFilesize: 1024 , acceptedFiles: ".jpg,.jpeg,.doc,.docx,.ppt,.pptx,.txt,.avi,.pdf,.mp3,.zip" , autoProcessQueue: false, paramName: "file" , dictDefaultMessage: "拖入需要上传的文件" , init: function () { var myDropzone = this, submitButton = document.querySelector( "#qr" ), cancelButton = document.querySelector( "#cancel" ); myDropzone.on( 'addedfile' , function ( file ) { / / 添加上传文件的过程,可再次弹出弹框,添加上传文件的信息 }); myDropzone.on( 'sending' , function (data, xhr, formData) { / / 向后台发送该文件的参数 formData.append( 'watermark' , jQuery( '#info' ).val()); }); myDropzone.on( 'success' , function (files, response) { / / 文件上传成功之后的操作 }); myDropzone.on( 'error' , function (files, response) { / / 文件上传失败后的操作 }); myDropzone.on( 'totaluploadprogress' , function (progress, byte, bytes) { / / progress为进度百分比 $( "#pro" ).text( "上传进度:" + parseInt(progress) + "%" ); / / 计算上传速度和剩余时间 var mm = 0 ; var byte = 0 ; var tt = setInterval(function () { mm + + ; var byte2 = bytes; var remain; var speed; var byteKb = byte / 1024 ; var bytesKb = bytes / 1024 ; var byteMb = byte / 1024 / 1024 ; var bytesMb = bytes / 1024 / 1024 ; if (byteKb < = 1024 ){ speed = (parseFloat(byte2 - byte) / ( 1024 ) / mm).toFixed( 2 ) + " KB/s" ; remain = (byteKb - bytesKb) / parseFloat(speed); } else { speed = (parseFloat(byte2 - byte) / ( 1024 * 1024 ) / mm).toFixed( 2 ) + " MB/s" ; remain = (byteMb - bytesMb) / parseFloat(speed); } $( "#dropz #speed" ).text( "上传速率:" + speed); $( "#dropz #time" ).text( "剩余时间" + arrive_timer_format(parseInt(remain))); if (bytes > = byte){ clearInterval(tt); if (byteKb < = 1024 ){ $( "#dropz #speed" ).text( "上传速率:0 KB/s" ); } else { $( "#dropz #speed" ).text( "上传速率:0 MB/s" ); } $( "#dropz #time" ).text( "剩余时间:0:00:00" ); } }, 1000 ); }); submitButton.addEventListener( 'click' , function () { / / 点击上传文件 myDropzone.processQueue(); }); cancelButton.addEventListener( 'click' , function () { / / 取消上传 myDropzone.removeAllFiles(); }); } }); / / 剩余时间格式转换: function arrive_timer_format(s) { var t; if (s > - 1 ){ var hour = Math.floor(s / 3600 ); var min = Math.floor(s / 60 ) % 60 ; var sec = s % 60 ; var day = parseInt(hour / 24 ); if (day > 0 ) { hour = hour - 24 * day; t = day + "day " + hour + ":" ; } else t = hour + ":" ; if ( min < 10 ){t + = "0" ;} t + = min + ":" ; if (sec < 10 ){t + = "0" ;} t + = sec; } return t; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | #urls.py from app01 import views urlpatterns = [ url(r '^admin/' , admin.site.urls), url(r '^test/' , views.dropzoneTest), ] #views.py from django.shortcuts import render def dropzoneTest(request): if request.is_ajax(): file = request.FILES.get( 'file' ) with open ( 'file.jpg' , 'wb' ) as f: for line in file : f.write(line) return render(request, 'dropzoneTest.html' ) #dropzoneDemo.html <!DOCTYPE html> <html lang = "en" > <head> <meta charset = "UTF-8" > <title>Title< / title> { % load static % } <link rel = "stylesheet" href = "{% static 'dropzone.css' %}" > <script src = "{% static 'jquery-3.2.1.min.js' %}" >< / script> <script src = "{% static 'dropzone.js' %}" >< / script> < / head> <body> <p>请上传身份照正反面照片< / p> <form id = "filedropzone" method = "post" action = "{{ request.path }}" class = "dropzone dz-clickable" >{ % csrf_token % } <div class = "dz-default dz-message" > <div class = "dz-icon icon-wrap icon-circle icon-wrap-md" > <i class = "fa fa-cloud-upload fa-3x" >< / i> < / div> <div> <p class = "dz-text" >把证件信息拖放到这里< / p> <p class = "text-muted" >最多可上传 2 张照片< / p> < / div> < / div> < / form> <! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > <script> $(document).ready(function () { $( "#filedropzone" ).dropzone({ url: "{{ request.path }}" , maxFiles: 5 , maxFilesize: 1024 , acceptedFiles: ".jpg,.jpeg,.doc,.docx,.ppt,.pptx,.txt,.avi,.pdf,.mp3,.zip" , autoProcessQueue: false, paramName: "file" , dictDefaultMessage: "拖入需要上传的文件" , init: function () { var myDropzone = this, submitButton = document.querySelector( "#qr" ), cancelButton = document.querySelector( "#cancel" ); myDropzone.on( 'addedfile' , function ( file ) { / / 添加上传文件的过程,可再次弹出弹框,添加上传文件的信息 }); myDropzone.on( 'sending' , function (data, xhr, formData) { / / 向后台发送该文件的参数 formData.append( 'watermark' , jQuery( '#info' ).val()); }); myDropzone.on( 'success' , function (files, response) { / / 文件上传成功之后的操作 }); myDropzone.on( 'error' , function (files, response) { / / 文件上传失败后的操作 }); myDropzone.on( 'totaluploadprogress' , function (progress, byte, bytes) { / / progress为进度百分比 $( "#pro" ).text( "上传进度:" + parseInt(progress) + "%" ); / / 计算上传速度和剩余时间 var mm = 0 ; var byte = 0 ; var tt = setInterval(function () { mm + + ; var byte2 = bytes; var remain; var speed; var byteKb = byte / 1024 ; var bytesKb = bytes / 1024 ; var byteMb = byte / 1024 / 1024 ; var bytesMb = bytes / 1024 / 1024 ; if (byteKb < = 1024 ) { speed = (parseFloat(byte2 - byte) / ( 1024 ) / mm).toFixed( 2 ) + " KB/s" ; remain = (byteKb - bytesKb) / parseFloat(speed); } else { speed = (parseFloat(byte2 - byte) / ( 1024 * 1024 ) / mm).toFixed( 2 ) + " MB/s" ; remain = (byteMb - bytesMb) / parseFloat(speed); } $( "#dropz #speed" ).text( "上传速率:" + speed); $( "#dropz #time" ).text( "剩余时间" + arrive_timer_format(parseInt(remain))); if (bytes > = byte) { clearInterval(tt); if (byteKb < = 1024 ) { $( "#dropz #speed" ).text( "上传速率:0 KB/s" ); } else { $( "#dropz #speed" ).text( "上传速率:0 MB/s" ); } $( "#dropz #time" ).text( "剩余时间:0:00:00" ); } }, 1000 ); }); submitButton.addEventListener( 'click' , function () { / / 点击上传文件 myDropzone.processQueue(); }); cancelButton.addEventListener( 'click' , function () { / / 取消上传 myDropzone.removeAllFiles(); }); } }); / / 剩余时间格式转换: function arrive_timer_format(s) { var t; if (s > - 1 ) { var hour = Math.floor(s / 3600 ); var min = Math.floor(s / 60 ) % 60 ; var sec = s % 60 ; var day = parseInt(hour / 24 ); if (day > 0 ) { hour = hour - 24 * day; t = day + "day " + hour + ":" ; } else t = hour + ":" ; if ( min < 10 ) { t + = "0" ; } t + = min + ":" ; if (sec < 10 ) { t + = "0" ; } t + = sec; } return t; } }) < / script> < / body> < / html> |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步