最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django后端分離 使用element-ui文件上傳方式

 更新時(shí)間:2020年07月12日 10:31:52   作者:PythonNew_Mr.Wang  
這篇文章主要介紹了Django后端分離 使用element-ui文件上傳方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

1:導(dǎo)入element

  <!-- 引入樣式 -->
  <link rel="stylesheet"  rel="external nofollow" >
  <!-- 引入組件庫(kù) -->
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.min.js"></script>
  <!-- 引入Vue -->
  <script src="https://unpkg.com/element-ui/lib/index.js"></script>

2:前端文件

css:
.avatar-uploader .el-upload {
  border: 1px dashed #d9d9d9;
  border-radius: 6px;
  cursor: pointer;
  position: relative;
  overflow: hidden;
 }
 .avatar-uploader .el-upload:hover {
  border-color: #409EFF;
 }
 .avatar-uploader-icon {
  font-size: 28px;
  color: #8c939d;
  width: 178px;
  height: 178px;
  line-height: 178px;
  text-align: center;
 }
 .avatar {
  width: 178px;
  height: 178px;
  display: block;
 }

html:
  {% comment %}   上傳圖片  {% endcomment %}
  <div id="profile">
    <h1 style="text-align: center" >更新社團(tuán)封面</h1>
    <div id="app" style="text-align: center">
      <el-upload            :data= "datas"              // 攜帶的參數(shù)            :headers="headers"          // 請(qǐng)求頭
          name="image"             {% comment %}  后端接收的參數(shù)名   {% endcomment %}
          class="avatar-uploader"
          action="/show/images/"         {% comment %}  上傳路由地址  {% endcomment %}
          :show-file-list="false"
          :on-success="handleAvatarSuccess"   {% comment %} 文件上傳成功時(shí)的鉤子 {% endcomment %}
          :before-upload="beforeAvatarUpload"> {% comment %} 上傳文件之前的鉤子,參數(shù)為上傳的文件 {% endcomment %}
        <img v-if="imageUrl" :src="imageUrl" class="avatar">
        <i v-else class="el-icon-plus avatar-uploader-icon"></i>
      </el-upload>
    </div>
    
  </div>
  {% comment %}   上傳圖片  {% endcomment %}

# JS:
<script>
  var Main = {
    data() {
      return {          headers:{},   // 請(qǐng)求頭是個(gè)對(duì)象          datas:{},    // 對(duì)象
        imageUrl: ''
      };
    },    create(){
          this.headers.authenticate = sessionStorage.getItem('token')  // 設(shè)置請(qǐng)求頭帶token
          this.datas.data = "userHead"  // 設(shè)置請(qǐng)求參數(shù)
    }    
    methods: {
      handleAvatarSuccess(res, file) {

        this.imageUrl = URL.createObjectURL(file.raw);
        console.log("imageUrl",this.imageUrl)
      },

      beforeAvatarUpload(file) {
        const isJPG = file.type === 'image/jpeg';
        const isLt2M = file.size / 1024 / 1024 < 2;

        if (!isJPG) {
          this.$message.error('上傳頭像圖片只能是 JPG 格式!');
        }
        if (!isLt2M) {
          this.$message.error('上傳頭像圖片大小不能超過(guò) 2MB!');
        }
        return isJPG && isLt2M;
      }
    }
  }
  var Ctor = Vue.extend(Main)
  new Ctor().$mount('#app')

</script>

3:后端文件

路由:
# 預(yù)覽圖片url("show/images/$", add_image.Image.as_view()),
py文件:from rest_framework.views import APIView
from SocietyPlat import settings
from django.shortcuts import render, redirect, HttpResponse
from Databases import models
from django.http import JsonResponse
import os

# 獲取相對(duì)路徑
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

class Image(APIView):
  def post(self, request):

    # 接收文件
    file_obj = request.FILES.get('image',None)     style = requetst.data.get('data')
    # 用戶名
    # username = str(request.data.get("username"))
    username = "Wang"

    print("file_obj",file_obj.name)

    # 判斷是否存在文件夾
    head_path = BASE_DIR + "\\media\\{}\\head".format(username).replace(" ","")
    print("head_path",head_path)
    # 如果沒(méi)有就創(chuàng)建文件路徑
    if not os.path.exists(head_path):
      os.makedirs(head_path)

    # print("文件名",file_obj.name)      # 文件名 name.png
    #
    # print("文件二進(jìn)制",file_obj.read())   # 文件二進(jìn)制 b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x0
    #
    # print("判斷文件> 2.5M",file_obj.multiple_chunks(chunk_size=None)) # 文件大小 False小于2.5M
    #
    # print("文件大小",file_obj.size)    # 文件大小 12651
    #
    # print("文件編碼",file_obj.charset)   # None
    #
    # print("隨文件一起上傳的內(nèi)容類型標(biāo)題",file_obj.content_type)  # image/png
    #
    # print("包含傳遞給content-type標(biāo)頭的額外參數(shù)的字典",file_obj.content_type_extra)  # {}
    #
    # print("text/content-types提供的utf8字符集編碼",file_obj.charset)  # None
    #
    #

    # 圖片后綴
    head_suffix = file_obj.name.split(".")[1]
    print("圖片后綴",head_suffix) # 圖片后綴 png

    # 儲(chǔ)存路徑
    file_path = head_path + "\\{}".format("head." + head_suffix)
    file_path = file_path.replace(" ","")
    print("儲(chǔ)存路徑", file_path)  # C:\Users\user\Desktop\DownTest\media\username\head\head.png

    # 上傳圖片
    with open(file_path, 'wb') as f:
      for chunk in file_obj.chunks():
        f.write(chunk)

    message = {}
    message['code'] = 200
    # 返回圖片路徑
    back_path = '\static\{}\head\{}'.format(username,"head." + head_suffix).replace(" ","")
    message['image'] =  back_path

    return JsonResponse(message)

補(bǔ)充知識(shí):django后臺(tái)接口處理element-ui的el-upload組件form data類型數(shù)據(jù)

對(duì)于向我這樣一只前端和后端的雙咸魚(yú)來(lái)說(shuō)寫一個(gè)不了解的接口實(shí)在是太難受了,前端不知道在哪找數(shù)據(jù),后端又不知道處理什么樣的數(shù)據(jù)。

現(xiàn)在有這樣一個(gè)需求,我需要使用element-ui中的el-upload組件完成一個(gè)上傳文件的功能。但是不知道是不是因?yàn)槲覜](méi)有發(fā)現(xiàn),我翻遍了官網(wǎng)都沒(méi)有找到這個(gè)組件點(diǎn)擊上傳以后發(fā)的是什么樣的數(shù)據(jù)請(qǐng)求。

終于我好像突然想起來(lái)瀏覽器的開(kāi)發(fā)者工具可以查看發(fā)出的請(qǐng)求

于是我們可以寫這么一個(gè)組件來(lái)一探究竟:

點(diǎn)擊上傳到服務(wù)器以后前臺(tái)就會(huì)發(fā)出請(qǐng)求,我們就可以使用devtool看具體的請(qǐng)求頭等等數(shù)據(jù),具體位置在這里:

點(diǎn)擊這個(gè)upload,找一找,我們就會(huì)發(fā)現(xiàn)最下面有一個(gè)file

這應(yīng)該就是我們要上傳的文件。可以看見(jiàn)它是以form data的形式上傳的。

所以我們就可以寫對(duì)應(yīng)的后端接口了。

這里給一個(gè)接口的demo

def writeFile(filePath, file):
  with open(filePath, "wb") as f:
    if file.multiple_chunks():
      for content in file.chunks():
        f.write(content)
    else:
      data=file.read() ###.decode('utf-8')
      f.write(data)

def uploadFile(request):
  if request.method == "POST": 
    fileDict = request.FILES.items()
    # 獲取上傳的文件,如果沒(méi)有文件,則默認(rèn)為None  
    if not fileDict:
      return JsonResponse({'msg': 'no file upload'})
    for (k, v) in fileDict:
      print("dic[%s]=%s" %(k,v))
      fileData = request.FILES.getlist(k)
      for file in fileData:
        fileName = file._get_name()
        filePath = os.path.join(settings.TEMP_FILE_PATH, fileName)
        print('filepath = [%s]'%filePath)
        try:
          writeFile(filePath, file)
        except:
          return JsonResponse({'msg': 'file write failed'})
    return JsonResponse({'msg': 'success'})

另外想要在前端獲取后端返回的請(qǐng)求的話可以使用on-success、on-error、on-exceed這幾個(gè)鉤子函數(shù),具體可以在element ui的官網(wǎng)找到

以上這篇Django后端分離 使用element-ui文件上傳方式就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python打開(kāi)指定網(wǎng)頁(yè)使用requests模塊爬蟲(chóng)示例詳解

    Python打開(kāi)指定網(wǎng)頁(yè)使用requests模塊爬蟲(chóng)示例詳解

    這篇文章主要介紹了Python打開(kāi)指定網(wǎng)頁(yè)使用requests模塊爬蟲(chóng)的示例,Python?requests是一個(gè)常用的HTTP請(qǐng)求庫(kù),可以方便地向網(wǎng)站發(fā)送HTTP請(qǐng)求,并獲取響應(yīng)結(jié)果,requests模塊比urllib模塊更簡(jiǎn)潔,感興趣的朋友可以參考下
    2024-02-02
  • python經(jīng)典百題之static定義靜態(tài)變量的三種方法

    python經(jīng)典百題之static定義靜態(tài)變量的三種方法

    日常腳本編寫過(guò)程中時(shí)常會(huì)用到python的靜態(tài)方法、實(shí)例方法、類方法,下面這篇文章主要給大家介紹了關(guān)于python經(jīng)典百題之static定義靜態(tài)變量的三種方法,需要的朋友可以參考下
    2024-09-09
  • python入門課程第三講之編碼規(guī)范知多少

    python入門課程第三講之編碼規(guī)范知多少

    這篇文章主要介紹了python入門課程第三講之編碼規(guī)范知多少,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • pytorch 使用單個(gè)GPU與多個(gè)GPU進(jìn)行訓(xùn)練與測(cè)試的方法

    pytorch 使用單個(gè)GPU與多個(gè)GPU進(jìn)行訓(xùn)練與測(cè)試的方法

    今天小編就為大家分享一篇pytorch 使用單個(gè)GPU與多個(gè)GPU進(jìn)行訓(xùn)練與測(cè)試的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • python學(xué)生管理系統(tǒng)的實(shí)現(xiàn)

    python學(xué)生管理系統(tǒng)的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了python學(xué)生管理系統(tǒng)的實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 使用pandas讀取文件的實(shí)現(xiàn)

    使用pandas讀取文件的實(shí)現(xiàn)

    這篇文章主要介紹了使用pandas讀取文件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • numpy增加維度、刪除維度的方法

    numpy增加維度、刪除維度的方法

    本文主要介紹了numpy增加維度、刪除維度的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • python Kmeans算法原理深入解析

    python Kmeans算法原理深入解析

    這篇文章主要介紹了python Kmeans算法深入解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python使用SQLite和Excel操作進(jìn)行數(shù)據(jù)分析

    Python使用SQLite和Excel操作進(jìn)行數(shù)據(jù)分析

    這篇文章主要介紹了Python使用SQLite和Excel操作進(jìn)行數(shù)據(jù)分析,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • python深度學(xué)習(xí)TensorFlow神經(jīng)網(wǎng)絡(luò)模型的保存和讀取

    python深度學(xué)習(xí)TensorFlow神經(jīng)網(wǎng)絡(luò)模型的保存和讀取

    這篇文章主要為大家介紹了python深度學(xué)習(xí)TensorFlow神經(jīng)網(wǎng)絡(luò)如何將訓(xùn)練得到的模型保存下來(lái)方便下次直接使用。為了讓訓(xùn)練結(jié)果可以復(fù)用,需要將訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)模型持久化
    2021-11-11

最新評(píng)論

玛纳斯县| 驻马店市| 邵东县| 雷山县| 四子王旗| 河北省| 河北区| 沁水县| 遂川县| 龙江县| 济阳县| 洪洞县| 甘南县| 沁源县| 弥渡县| 崇仁县| 颍上县| 汤阴县| 石狮市| 托里县| 揭东县| 阿拉善盟| 柳河县| 察隅县| 平塘县| 诏安县| 静宁县| 来安县| 金山区| 芒康县| 天全县| 乌海市| 晋江市| 永福县| 榆社县| 康马县| 上饶市| 同仁县| 车险| 马关县| 泽普县|