基于django和dropzone.js實(shí)現(xiàn)上傳文件
1、dropzone.js
dropzone.js是一個(gè)可預(yù)覽\可定制化的文件拖拽上傳,實(shí)現(xiàn)AJAX異步上傳文件的工具
2、dropzone.js前端界面上傳方式
官網(wǎng)下載 并且引入dropzone.js和dropzone.css(http://www.dropzonejs.com/)以及引用jquery.js,定義一個(gè)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做上傳區(qū)域時(shí)使用的配置 Dropzone.autoDiscover = false;//不知道該行有什么用,歡迎高手下方評(píng)論解答 $("#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", //默認(rèn)為file maxFiles:1,//一次性上傳的文件數(shù)量上限 maxFilesize: 2, //文件大小,單位:MB acceptedFiles: ".jpg,.gif,.png,.jpeg", //上傳的類(lèi)型 addRemoveLinks:true, parallelUploads: 1,//一次上傳的文件數(shù)量 //previewsContainer:"#preview",//上傳圖片的預(yù)覽窗口 dictDefaultMessage:'拖動(dòng)文件至此或者點(diǎn)擊上傳', dictMaxFilesExceeded: "您最多只能上傳1個(gè)文件!", dictResponseError: '文件上傳失敗!', dictInvalidFileType: "文件類(lèi)型只能是*.jpg,*.gif,*.png,*.jpeg。", dictFallbackMessage:"瀏覽器不受支持", dictFileTooBig:"文件過(guò)大上傳文件最大支持.", dictRemoveLinks: "刪除", dictCancelUpload: "取消", //對(duì)一些方法的后續(xù)處理 init:function(){ this.on("addedfile", function(file) { //上傳文件時(shí)觸發(fā)的事件 document.querySelector('div .dz-default').style.display = 'none'; }); this.on("success",function(file,data){ alert(data.data) //上傳成功觸發(fā)的事件 console.log('ok'); }); this.on("error",function (file,data) { //上傳失敗觸發(fā)的事件 console.log('fail'); var message = ''; //lavarel框架有一個(gè)表單驗(yàn)證, //對(duì)于ajax請(qǐng)求,JSON 響應(yīng)會(huì)發(fā)送一個(gè) 422 HTTP 狀態(tài)碼, //對(duì)應(yīng)file.accepted的值是false,在這里捕捉表單驗(yàn)證的錯(cuò)誤提示 if (file.accepted){ $.each(data,function (key,val) { message = message + val[0] + ';'; }) //控制器層面的錯(cuò)誤提示,file.accepted = true的時(shí)候; alert(message); } }); this.on("removedfile",function(file){ //刪除文件時(shí)觸發(fā)的方法(向后臺(tái)發(fā)送刪除文件請(qǐng)求) {# $.post('/admin/del/'+ file_id,{'_method':'DELETE'},function (data) {#} {# console.log('刪除結(jié)果:'+data.message);#} {# })#} document.querySelector('div .dz-default').style.display = 'block'; }); } }); </script> </body> </html>
方法二中,很多參數(shù)是不一定需要定義的,參見(jiàn)方法一
3、后臺(tái)處理dropzone.js前端界面上傳的文件
A、django的settings.py 文件定義上傳文件夾:
#文件上傳文件夾定義
ENROLLED_DATA = '%s/statics/enrolled_data' %BASE_DIR
B、對(duì)應(yīng)的view處理前端上傳過(guò)來(lái)的數(shù)據(jù):
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請(qǐng)求 if not os.path.exists(ENROLLED_DATA): #如果settings定義的 上傳文件夾不存在 os.makedirs(ENROLLED_DATA,exist_ok=True) #新建文件夾 for k,file_obj in request.FILES.items(): #獲取前端傳過(guò)來(lái)的文件數(shù)據(jù) with open('%s/%s'%(ENROLLED_DATA,file_obj.name),"wb") as f: #打開(kāi)文件 for chunk in file_obj.chunks(): f.write(chunk) #chunk方式寫(xiě)入文件 return render(request, 'dropzone-back.html')
C、上傳成功:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Django 如何實(shí)現(xiàn)文件上傳下載
- Django和Ueditor自定義存儲(chǔ)上傳文件的文件名
- 詳解Django自定義圖片和文件上傳路徑(upload_to)的2種方式
- python中Django文件上傳方法詳解
- Django后端分離 使用element-ui文件上傳方式
- Django Admin 上傳文件到七牛云的示例代碼
- Django實(shí)現(xiàn)任意文件上傳(最簡(jiǎn)單的方法)
- Django 解決上傳文件時(shí),request.FILES為空的問(wèn)題
- Django中文件上傳和文件訪問(wèn)微項(xiàng)目的方法
- django 文件上傳功能的相關(guān)實(shí)例代碼(簡(jiǎn)單易懂)
- django上傳文件的三種方式
相關(guān)文章
對(duì)python 數(shù)據(jù)處理中的LabelEncoder 和 OneHotEncoder詳解
今天小編就為大家分享一篇對(duì)python 數(shù)據(jù)處理中的LabelEncoder 和 OneHotEncoder詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07Python利用format函數(shù)實(shí)現(xiàn)對(duì)齊打印(左對(duì)齊、右對(duì)齊與居中對(duì)齊)
format是字符串內(nèi)嵌的一個(gè)方法,用于格式化字符串,下面這篇文章主要給大家介紹了關(guān)于Python利用format函數(shù)實(shí)現(xiàn)對(duì)齊打印(左對(duì)齊、右對(duì)齊與居中對(duì)齊)的相關(guān)資料,需要的朋友可以參考下2022-04-04Python字符串逆序的實(shí)現(xiàn)方法【一題多解】
今天小編就為大家分享一篇關(guān)于Python字符串逆序的實(shí)現(xiàn)方法【一題多解】,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02用openCV和Python 實(shí)現(xiàn)圖片對(duì)比,并標(biāo)識(shí)出不同點(diǎn)的方式
今天小編就為大家分享一篇用openCV和Python 實(shí)現(xiàn)圖片對(duì)比,并標(biāo)識(shí)出不同點(diǎn)的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Python數(shù)據(jù)結(jié)構(gòu)與算法之二叉樹(shù)結(jié)構(gòu)定義與遍歷方法詳解
這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)與算法之二叉樹(shù)結(jié)構(gòu)定義與遍歷方法,結(jié)合實(shí)例形式詳細(xì)分析了Python實(shí)現(xiàn)二叉樹(shù)結(jié)構(gòu)的定義、遍歷方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-12-12python傳到前端的數(shù)據(jù),雙引號(hào)被轉(zhuǎn)義的問(wèn)題
這篇文章主要介紹了python傳到前端的數(shù)據(jù),雙引號(hào)被轉(zhuǎn)義的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Python?pygame新手入門(mén)基礎(chǔ)教程
大家都知道pygame是跨平臺(tái)Python模塊,專為電子游戲設(shè)計(jì),包含圖像、聲音,這篇文章主要給大家介紹了關(guān)于Python?pygame新手入門(mén)基礎(chǔ)教程的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07python添加命令行參數(shù)的詳細(xì)過(guò)程
Click 是 Flask 的開(kāi)發(fā)團(tuán)隊(duì) Pallets 的另一款開(kāi)源項(xiàng)目,它是用于快速創(chuàng)建命令行的第三方模塊,這篇文章主要介紹了python怎么添加命令行參數(shù),需要的朋友可以參考下2023-06-06在Python的Django框架下使用django-tagging的教程
這篇文章主要介紹了在Python的Django框架下使用django-tagging的教程,針對(duì)網(wǎng)絡(luò)編程中的tag部分功能提供幫助,需要的朋友可以參考下2015-05-05