日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

vue與django(drf)實(shí)現(xiàn)文件上傳下載功能全過程

瀏覽:325日期:2022-06-01 13:17:28
目錄
  • 文件上傳功能
    • 上傳后端部分
    • 上傳前端部分(vue添加vue.js和node.js,設(shè)置eslint)
  • 文件下載功能
    • 下載后端部分
    • 下載前端部分
  • 總結(jié)

    文件上傳功能

    上傳后端部分

    (一)Models.py

    from django.db import modelsclass FilesModel(models.Model): //模型名(默認(rèn)表名)	name = models.CharField(max_length=20, default="")      //name,fle是字段名(file為上傳的文件)    file = models.FileField(upload_to="uploads/") //upload上傳功能實(shí)現(xiàn),to上傳后保存的路徑    class Meta:db_table = "files_storage"     //自定義的表名ordering = ["-id"]     //按順序排列

    (二)Serializer.py

    使用 Django REST framework 實(shí)現(xiàn)后端 REST API,需創(chuàng)建序列化器 serializers.py,內(nèi)容如下:

    from rest_framework import serializersfrom files import models   //files 是 app 的名字class FilesSerializer(serializers.ModelSerializer):    class Meta:model = models.FilesModel      //指定模型fields = "__all__"     //指定序列化的字段名

    (三)views.py

    from rest_framework.viewsets import ModelViewSetfrom files import models, serializersclass FileViewSet(ModelViewSet):    queryset = models.FilesModel.objects.all()     //返回全部字段    serializer_class = serializers.FilesSerializer //指定序列化器類型

    (四)urls

    1.項(xiàng)目總配置路徑下(settings.py 所在的路徑)編輯根路由配置文件 urls.py

    from django.contrib import adminfrom django.urls import path, includeurlpatterns = [    path("admin/", admin.site.urls),    path("storage/", include("files.urls")) //網(wǎng)址前綴及指定某子app的url]

    2.app為files 的路徑下新建 urls.py 文件,填寫路由配置:

    from django.urls import include, pathfrom rest_framework import routersfrom files import viewsrouter = routers.DefaultRouter()router.register(r"files", views.FileViewSet)   //注冊(cè)路徑urlpatterns = [    path("", include(router.urls))]

    (五)測(cè)試后端api

    運(yùn)行后臺(tái)服務(wù) python manage.py runserver 0.0.0.0:8000,訪問 http://xx.xx.xx.xx:8000/storage/files/,界面如下:

    上傳前端部分(vue添加vue.js和node.js,設(shè)置eslint)

    <template>  <div>    <el-label>名稱</el-label>    <el-input v-model="fileData.name" />    <el-upload      ref="upload"      drag           action="http://xx.xx.xx.xx:8000/storage/files/"      :data="fileData"      :auto-upload="false"      :on-success="onSuccess"         >      <i />      <div>將文件拖到此處,或<em>點(diǎn)擊上傳</em></div>    </el-upload>    <el-button size="small" type="success" @click="submitUpload">上傳到服務(wù)器</el-button>  </div></template><script>export default {  name: "UploadDemo",  data() {    return {      fileData: {name: ""      }    }  },  methods: {    submitUpload() {      this.$refs.upload.submit()    },    onSuccess() {      this.$message.success("上傳成功")    }  }}</script>

    其中 el-upload 組件的 action 屬性用于指定后臺(tái) API 的 URI;

    :auto-upload 屬性用于設(shè)置是否自動(dòng)上傳(這里設(shè)置為 false,手動(dòng)觸發(fā)上傳動(dòng)作);

    :on-success 屬性用于指定上傳成功后觸發(fā)的方法。

    submitUpload() 中的 this.$refs.upload.submit() 方法觸發(fā)文件上傳動(dòng)作。

    其中 el-upload 組件的 :data 屬性用于指定文件上傳時(shí)附加的數(shù)據(jù)(類型為 JavaScript 對(duì)象)。

    注意:

    1.env.development文件里改成BASE_API = ‘/api’

    2.除增刪改查外,上傳的接口在index.vue文件里寫了,不用額外在api文件夾里加接口

    3.route里的函數(shù)調(diào)用后端接口

    4.前端一個(gè)頁面可對(duì)應(yīng)后端多個(gè)接口

    上傳完成,后臺(tái)數(shù)據(jù)如下:

    [    {"file": "http://172.20.23.34:8000/storage/files/uploads/AnyDesk.exe","id": 19,"name": "測(cè)試文件"    },    {"file": "http://172.20.23.34:8000/storage/files/uploads/template.html","id": 18,"name": ""    },    {"file": "http://172.20.23.34:8000/storage/files/uploads/20171215091830_55126_hSnPtZR.png","id": 17,"name": ""    }]

    文件下載功能

    下載后端部分

    views.py

        @action(methods=["get", "post"], detail=True)    def download(self, request, pk=None, *args, **kwargs):file_obj = self.get_object()response = FileResponse(open(file_obj.file.path, "rb"))return response

    下載前端部分

    download.vue

    <template>  <el-table    :data="filelist.filter(data => !search || data.name.toLowerCase().includes(search.toLowerCase()))"     >    <el-table-column      label="序號(hào)"      prop="id"    />    <el-table-column      label="上傳時(shí)間"      prop="date"    />    <el-table-column      label="上傳用戶"      prop="auther"    />    <el-table-column      label="文件名"      prop="filename"    />    <el-table-column      align="right"    >      <template slot="header"><el-input  v-model="search"  size="mini"  placeholder="輸入關(guān)鍵字搜索"/>      </template>      <template slot-scope="scope"><el-button  size="mini"  @click="handleDown(scope.$index, scope.row)">Down</el-button><el-button  size="mini"  type="danger"  @click="handleDelete(scope.$index, scope.row)">Delete</el-button>      </template>    </el-table-column>  </el-table></template><script>import { getPkgsList } from "@/api/user"import { getToken } from "@/utils/auth"import { delpkg } from "@/api/user"import axios from "axios"export default {  data() {    return {      headers: {Authorization: "Bearer " + getToken()      },      // addForm: {      //   // 文件的數(shù)組      //   pics: []      // },      filelist: [],      search: "",      listLoading: true    }  },  created() {    this.fetchPkgsList()  },  methods: {    handleChange(file, filelist) {      this.filelist = filelist.slice(-3)    },    onSuccess() {      this.$message.success("上傳成功")    },    fetchPkgsList() {      this.listLoading = true      getPkgsList().then(response => {console.log("getPkgsList ========> ", response)this.filelist = response.data.resultsthis.listLoading = false      })    },    downloadFile(url, options = {}) {      return new Promise((resolve, reject) => {// console.log(`${url} 請(qǐng)求數(shù)據(jù),參數(shù)=>`, JSON.stringify(options))axios.defaults.headers["Authorization"] = "Bearer " + getToken()axios({  method: "post",  url: url, // 請(qǐng)求地址  data: options, // 參數(shù)  responseType: "blob" // 表明返回服務(wù)器返回的數(shù)據(jù)類型}).then(  response => {    // console.log("下載響應(yīng)",response)    resolve(response.data.result)    debugger    const blob = new Blob([response.data])    // console.log(blob)    // let fileName = Date.parse(new Date()) + ".xlsx"    // 切割出文件名    const fileNameEncode = options.filename    // 解碼    const fileName = decodeURIComponent(fileNameEncode)    // console.log("fileName",fileName)    if (window.navigator.msSaveOrOpenBlob) {      // console.log(2)      navigator.msSaveBlob(blob, fileName)    } else {      // console.log(3)      var link = document.createElement("a")      link.href = window.URL.createObjectURL(blob)      link.download = fileName      link.click()      // 釋放內(nèi)存      window.URL.revokeObjectURL(link.href)    }  },  err => {    reject(err)  })      })    },    handleDown(index, row) {      const postUrl = "/api/files/" + (row.id) + "/download/"      const params = { filename: row.filename }      this.downloadFile(postUrl, params)    },    handleDelete(index, row) {      this.listLoading = true      // const i = this.addForm.pics.findIndex((x) => x.pic === row.file)      // this.addForm.pics.splice(i, 1)      this.$confirm(`確定移除 ${row.filename}?`)      delpkg(row.id).then(response => {// console.log("getPkgsList ========> ", response)// console.log(index)// console.log(this.filelist.length)this.filelist = this.filelist.slice(index, 1)this.fetchPkgsList()// console.log(this.filelist)this.listLoading = false      })    }  }}</script>

    總結(jié)

    到此這篇關(guān)于vue與django(drf)實(shí)現(xiàn)文件上傳下載功能的文章就介紹到這了,更多相關(guān)vue與django文件上傳下載內(nèi)容請(qǐng)搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

    標(biāo)簽: JavaScript
    相關(guān)文章:
    日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
    久久九九精品| 久久美女性网| 一区二区精品| 在线观看亚洲精品福利片| 播放一区二区| 久久高清免费| 黄色免费成人| 中文无码日韩欧| 日本在线成人| 国产欧美日韩精品一区二区免费 | 男人操女人的视频在线观看欧美| 亚洲欧美网站| 日韩精品中文字幕一区二区| 国产精品毛片久久久| 免费亚洲婷婷| 天堂√中文最新版在线| 欧美日韩四区| 日韩av资源网| 国产成人久久| 欧洲激情综合| 日韩高清不卡在线| 粉嫩av一区二区三区四区五区 | 久久精品不卡| 在线亚洲成人| 日本欧美大码aⅴ在线播放| 国产精品手机在线播放| 日韩国产激情| 亚洲我射av| 麻豆久久久久久久| 国产精品av久久久久久麻豆网| 久久99伊人| 国产福利亚洲| 亚洲高清激情| 亚洲精品大片| 国产精品99一区二区三| 99在线观看免费视频精品观看| 日韩有吗在线观看| 高清av一区| 亚洲欧洲另类| 日韩成人午夜精品| 欧美片第1页| 亚洲tv在线| av高清不卡| 日日夜夜免费精品视频| 国产精品久久久久久久久久10秀| 亚洲一区黄色| 精品理论电影在线| 中文在线一区| 免费在线欧美黄色| 中文亚洲免费| 日韩成人免费| 中文字幕成人| 欧美激情三区| 在线视频日韩| 精品中文字幕一区二区三区| 午夜欧美精品| 久久91视频| 老司机久久99久久精品播放免费| 欧美激情99| 中文一区在线| 国产高潮在线| 欧美自拍一区| 日韩一级欧洲| 精品国产乱码| 涩涩涩久久久成人精品| 国产99精品一区| 精品视频一二| 亚洲精品高潮| 免费精品国产的网站免费观看| 久久99蜜桃| 综合国产精品| 欧美日一区二区| 国产精品蜜芽在线观看| 欧美亚洲网站| 中文在线日韩| 91久久久久| 久久久久欧美精品| 国产中文欧美日韩在线| 青青伊人久久| 日韩中文字幕区一区有砖一区 | 国产欧美日韩一区二区三区在线| 亚洲欧美日韩高清在线| 色爱综合网欧美| 国产精品久久久久久久久久白浆 | 国产精品白丝一区二区三区| 亚洲小说春色综合另类电影| 国产一在线精品一区在线观看| 国产一区二区久久久久| 欧美自拍一区| 日韩国产精品久久久| 蜜臀久久99精品久久久久宅男| 视频二区不卡| 里番精品3d一二三区| 奇米色欧美一区二区三区| 蜜桃久久av| 亚洲免费网址| 1000部精品久久久久久久久| 麻豆视频一区二区| 国产日韩欧美三级| 日本不卡高清视频| 亚洲精品乱码| 日韩有码av| 日韩三级一区| 亚洲午夜国产成人| 蜜臀精品一区二区三区在线观看 | 国产情侣一区| 天堂俺去俺来也www久久婷婷| 在线亚洲精品| 亚洲精品在线观看91| 久久久久.com| 久久要要av| 免费视频亚洲| 狠狠久久婷婷| 9色精品在线| 性一交一乱一区二区洋洋av| 亚洲欧美网站| 蜜桃视频一区二区三区在线观看| 天使萌一区二区三区免费观看| 久久中文字幕二区| 成人av二区| 亚洲激情av| 蜜桃视频免费观看一区| 亚洲精品高潮| 亚洲欧美专区| 奇米狠狠一区二区三区| 国产情侣久久| 国产成人免费| 99热精品久久| 玖玖玖国产精品| 日本色综合中文字幕| 国产精品一区二区三区美女 | 国产精品99在线观看| 中文字幕在线视频久| 中文一区一区三区高中清不卡免费| 国产精品伦理久久久久久| 毛片在线网站| 91精品精品| 国产亚洲福利| 日韩极品在线观看| 嫩呦国产一区二区三区av| 四虎成人av| 亚洲国内欧美| 亚洲人成亚洲精品| 国产亚洲第一伦理第一区| 鲁大师精品99久久久| 伊人网在线播放| 亚洲91视频| 视频一区国产视频| 久久国产三级| 欧美不卡高清一区二区三区| 一区免费视频| 色综合视频一区二区三区日韩 | 国产在线成人| 蜜臀av性久久久久蜜臀aⅴ流畅| 777久久精品| 中文字幕在线视频网站| 狠狠色狠狠色综合日日tαg| 婷婷综合一区| 91免费精品| 国产精品外国| 国产精品www994| 91精品国产福利在线观看麻豆| 免费日韩视频| 欧美国产精品| 日韩视频在线一区二区三区 | 精品视频在线你懂得| 亚洲午夜黄色| 日韩av网站在线免费观看| 日本激情一区| 日韩专区在线视频| 国产suv精品一区二区四区视频| 国产高清一区| 国产欧美一级| 激情婷婷亚洲| 国产精品亲子伦av一区二区三区| 亚洲va中文在线播放免费| 亚洲a成人v| 日韩精品免费一区二区在线观看| 亚洲精品系列| 午夜精品成人av| 日本成人中文字幕| 亚洲午夜视频| 国产精品videossex久久发布| 欧美日韩在线播放视频| 国产色噜噜噜91在线精品| 91久久久精品国产| 国产精品男女| 亚洲精品小说| 久久99蜜桃| 免费欧美在线视频| 色婷婷狠狠五月综合天色拍| 欧美色综合网| 性一交一乱一区二区洋洋av| 中文在线а√在线8| 欧美日韩一区二区三区四区在线观看| 欧美一区二区三区高清视频| 国产精品多人| 亚洲一区二区三区久久久| 丝袜美腿诱惑一区二区三区 | 欧美成人精品|