Django+Vue實(shí)現(xiàn)文件上傳下載的項(xiàng)目實(shí)踐
前言
首先我要實(shí)現(xiàn)的頁(yè)面效果是這樣的
當(dāng)點(diǎn)擊上傳文件按鈕,彈出上傳文件的彈出框,可以上傳多個(gè)文件,點(diǎn)擊確定后才正式開(kāi)始上傳
點(diǎn)擊右側(cè)下載按鈕,可以直接下載文件。
上傳功能
后端代碼
settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, '../upload') MEDIA_URL = '/upload/'
這段代碼表示你上傳的文件都會(huì)放在你項(xiàng)目根目錄的upload文件夾下。
views.py
@api_view(('POST',)) @renderer_classes((TemplateHTMLRenderer, JSONRenderer)) def upload_list(request): # 如果項(xiàng)目根目錄沒(méi)有upload文件夾,會(huì)自動(dòng)給你創(chuàng)建一個(gè) folder_path = settings.MEDIA_ROOT if not os.path.exists(folder_path): os.makedirs(folder_path) files = request.FILES.getlist('file') for file in files: # 這三行代碼就是上傳文件的代碼 f = open(settings.MEDIA_ROOT + "/" + file.name, mode='wb') for chunk in file.chunks(): f.write(chunk) # 這段代碼是我要網(wǎng)數(shù)據(jù)庫(kù)里存的一些文件信息,如果不存庫(kù)的話不用寫(xiě) size = file.size suffix = file.content_type createUser = request.user filePath = settings.MEDIA_URL + file.name name = file.name # 上傳完文件記得要關(guān)閉 # 需要注意的一點(diǎn),如果f.close()這句代碼之前,上傳文件之后有報(bào)錯(cuò),那你文件是一直被占用的狀態(tài),刪除也刪不掉,所以一定要做好代碼順序 f.close() # 往數(shù)據(jù)庫(kù)里存文件信息 Filemanage.objects.create(size=size, suffix=suffix, create_user=createUser, file_path=filePath, name=name) return JsonResponse(OrderedDict([ ('results', {}) ], code=status.HTTP_200_OK))
前端代碼
<el-upload class="upload-demo" ref="upload" action="" :auto-upload="false" :http-request="upload" :before-upload="beforeAvatarUpload" multiple > <el-button size="small" type="primary">點(diǎn)擊上傳</el-button> </el-upload>
:ref="upload":必須要寫(xiě),因?yàn)槲覀兪鞘謩?dòng)上傳方式。
:auto-upload="false":這里我設(shè)置的不自動(dòng)上傳,如果你沒(méi)有確定按鈕,點(diǎn)擊一起上傳的需求,那你就把值變?yōu)閠ure,你選完文件后會(huì)自動(dòng)上傳。
:http-request="upload":覆蓋默認(rèn)的上傳行為,可以自定義上傳的實(shí)現(xiàn)。
:before-upload="beforeAvatarUpload":上傳文件之前的鉤子,一般用于限制上傳文件大小和類型。
multiple:多文件上傳。
methods: { beforeAvatarUpload(file) { const isLt2M = file.size / 1024 / 1024 < 200; if (!isLt2M) { this.$message.error('上傳頭像圖片大小不能超過(guò)2MB!'); } return isLt2M; }, upload(param) { const formData = new FormData() formData.append('file', param.file) mail.uploadFile(formData).then(response => { console.log('上傳圖片成功') this.$refs.upload.clearFiles() }).catch(response => { console.log(response) this.$refs.upload.clearFiles() }); }, }
下載功能
后端代碼
def download(request, nid): # 通過(guò)前臺(tái)傳來(lái)的id查出文件名 row_object = Filemanage.objects.filter(id=nid).first() # 文件的相對(duì)路徑 file_path = '/upload/' + row_object.name # 打開(kāi)文件 with open(settings.MEDIA_ROOT + "/" + row_object.name, 'rb') as f: response = HttpResponse(f.read()) # 設(shè)置Content-Disposition頭以強(qiáng)制瀏覽器下載文件 file_name = os.path.basename(file_path) response["Content-Type"] = "application/octet-stream" response['Content-Disposition'] = f'attachment; filename="{file_name}"' return response
前端代碼
<el-button v-if="permissionList.del" size="small" type="success " @click="download(row)" >{{ "下載" }}</el-button>
methods: { download(row) { this.loading = true; // 這塊是我封裝的axios請(qǐng)求,請(qǐng)求時(shí)要帶著responseType: 'blob',我會(huì)在下面放上我的代碼 file.requestDownload(row.id).then((response) => { const url = window.URL.createObjectURL(new Blob([response.data])); const link = document.createElement('a'); link.href = url; link.setAttribute('download', row.name); document.body.appendChild(link); link.click(); }) .catch((e) => { console.log(e) }); }, }
requestDownload(id) { return request({ url: '/tool/download/' + id + '/', method: 'get', responseType: 'blob' }) }
到此這篇關(guān)于Django+Vue實(shí)現(xiàn)文件上傳下載的項(xiàng)目實(shí)踐的文章就介紹到這了,更多相關(guān)Django Vue文件上傳下載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python如何讀取txt文件,獲取指定行中指定位置數(shù)據(jù)
這篇文章主要介紹了Python如何讀取txt文件,獲取指定行中指定位置數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03python利用itertools生成密碼字典并多線程撞庫(kù)破解rar密碼
這篇文章主要介紹了python利用itertools生成密碼字典并多線程撞庫(kù)破解rar密碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Python pandas 重命名索引和列名稱的實(shí)現(xiàn)
本文主要介紹了Python pandas 重命名索引和列名稱的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Python tkinter實(shí)現(xiàn)圖片標(biāo)注功能(完整代碼)
tkinter是Python下面向tk的圖形界面接口庫(kù),可以方便地進(jìn)行圖形界面設(shè)計(jì)和交互操作編程,本文通過(guò)實(shí)例代碼給大家介紹的Python tkinter實(shí)現(xiàn)圖片標(biāo)注功能,感興趣的朋友一起看看吧2019-12-12Python腳本在Appium庫(kù)上對(duì)移動(dòng)應(yīng)用實(shí)現(xiàn)自動(dòng)化測(cè)試
這篇文章主要介紹了使用Python的Appium庫(kù)對(duì)移動(dòng)應(yīng)用實(shí)現(xiàn)自動(dòng)化測(cè)試的教程,屬于Python腳本的一個(gè)自動(dòng)化應(yīng)用,需要的朋友可以參考下2015-04-04深入理解Python中的 __new__ 和 __init__及區(qū)別介紹
這篇文章主要介紹了深入理解Python中的 __new__ 和 __init__及區(qū)別介紹,這兩個(gè)方法的主要區(qū)別在于:__new__ 負(fù)責(zé)對(duì)象的創(chuàng)建而 __init__ 負(fù)責(zé)對(duì)象的初始化。具體內(nèi)容詳情大家跟隨小編一起看看吧2018-09-09Pycharm中如何編寫(xiě)B(tài)ash批處理命令
這篇文章主要介紹了Pycharm中如何編寫(xiě)B(tài)ash批處理命令,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06如何使用python編寫(xiě)一個(gè)簡(jiǎn)單的課時(shí)記錄系統(tǒng)
編寫(xiě)一個(gè)應(yīng)用系統(tǒng)需要多方面的知識(shí)和技能,下面這篇文章主要給大家介紹了關(guān)于如何使用python編寫(xiě)一個(gè)簡(jiǎn)單的課時(shí)記錄系統(tǒng)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-04-04VSCode中Python環(huán)境配置、創(chuàng)建虛擬環(huán)境及pip的一些常用命令
這篇文章主要給大家介紹了關(guān)于VSCode中Python環(huán)境配置、創(chuàng)建虛擬環(huán)境及pip的一些常用命令,Python環(huán)境的創(chuàng)建是在VSCode中很常見(jiàn)的一個(gè)需求,特別是當(dāng)我們需要開(kāi)發(fā)或者調(diào)試多個(gè)Python項(xiàng)目時(shí),使用虛擬環(huán)境是一種好的方式,需要的朋友可以參考下2023-10-10