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

Vue2.0利用vue-resource上傳文件到七牛的實例代碼

 更新時間:2017年07月28日 09:54:24   作者:Smohan  
本篇文章主要介紹了Vue2.0利用vue-resource上傳文件到七牛的實例代碼,具有一定的參考價值,有興趣的可以了解一下

本文介紹了Vue2.0利用vue-resource上傳文件到七牛,分享給大家,希望對大家有幫助

關于上傳,總是有很多可以說道的。

16年底,公司項目番茄表單的前端部分,開始了從傳統的jquery到vue 2.0的徹底重構。但是上傳部分,無論是之前的傳統版本,還是Vue新版本,都是在使用著FileAPI這款優(yōu)秀的開源庫,只是進行了簡單的directive化。為什么呢?因為兼容性。沒辦法,公司項目不等同于個人項目,必須要考慮大多數瀏覽器。否則,上傳部分完全可以利用Vue-Resource以及FormData來拋開對FileAPI的依賴。這讓我深感遺憾,幸好這個簡單的遺憾在個人博客Vue化重構的時候得以彌補。

上傳流程

圖不重要看文字

input[type="file"] change事件觸發(fā)后,先去(如果是圖片,可以同時通過FileReader以及readAsDataURL將圖片預覽在頁面上)后臺請求七牛的上傳token,將拿到的token和key以及通過change傳遞過來的files一起append到formData中。然后將formData通過post傳遞給七牛,七牛在處理后將返回真正的文件地址

獲取token

const qiniu = require('qiniu')
const crypto = require('crypto')
const Config = require('qiniu-config')

exports.token = function*() {
  //構建一個保存文件名
  //這里沒有處理文件后綴,需要自己傳遞過來,然后在這里處理加在key上,非必須
  const key = crypto.createHash('md5').update(((new Date()) * 1 + Math.floor(Math.random() * 10).toString())).digest('hex')
  //Config 七牛的秘鑰等配置
  const [ACCESS_KEY, SECRET_KEY, BUCKET] = [Config.accessKey, Config.secretKey, Config.bucket] 
  qiniu.conf.ACCESS_KEY = ACCESS_KEY
  qiniu.conf.SECRET_KEY = SECRET_KEY
  const upToken = new qiniu.rs.PutPolicy(BUCKET + ":" + key)
  try {
    const token = upToken.token()
    return this.body = {
      key: key,
      token: token
    }
  } catch (e) {
    // throw error
  }
}

//假設api 地址是 /api/token 

上傳組件 upload.vue

<template>
  <label class="mo-upload">
    <input type="file" :accept="accepts" @change="upload">
    <slot></slot>
  </label>
</template>
<style lang="scss">
  .mo-upload {
    display: inline-block;
    position: relative;
    margin-bottom: 0;
    input[type="file"] {
      display: none;
    }
    .mo-upload--label {
      display: inline-block;
      position: relative;
    }
  }
</style>
<script>
  export default {
    name : 'MoUpload',
    props : {
      accepts : { //允許的上傳類型
        type : String,
        default : 'image/jpeg,image/jpg,image/png,image/gif'
      },
      flag : [String, Number], //當前上傳標識,以便于在同一個監(jiān)聽函數中區(qū)分不同的上傳域
      maxSize : {
        type : Number,
        default : 0 //上傳大小限制
      }, 
    },
    methods: {
      upload (event) {
        let file = event.target.files[0]
        const self = this
        const flag = this.flag
        if (file) {
          if (this.maxSize) {
            //todo filter file
          }
          //filter file, 文件大小,類型等過濾
          //如果是圖片文件
          // const reader = new FileReader()
          // const imageUrl = reader.readAsDataURL(file)
          // img.src = imageUrl //在預覽區(qū)域插入圖片

          const formData = new FormData()
          formData.append('file', file)
          
          //獲取token
          this.$http.get(`/api/token/`)
          .then(response => {
            const result = response.body
            formData.append('token', result.token)
            formData.append('key', result.key)
            //提交給七牛處理
            self.$http.post('https://up.qbox.me/', formData, {
              progress(event) {
                //傳遞給父組件的progress方法
                self.$emit('progress', parseFloat(event.loaded / event.total * 100), flag) 
              }
            })
            .then(response => {
              const result = response.body
              if (result.hash && result.key) {
                //傳遞給父組件的complete方法
                self.$emit('complete', 200 , result, flag)
                //讓當前target可以重新選擇
                event.target.value = null
              } else {
                self.$emit('complete', 500, result, flag)
              }
            }, error => self.$emit('complete', 500, error.message), flag)
          })
        }
      }
    }
  }
</script>

父組件調用

<template>
  <section>
    ...
    <figure class="upload-preview">
      <img :src="thumbnail" v-if="thumbnail"/>
    </figure>
    <mo-upload flag="'thumbnail'" @complete="uploadComplete" @progress="uploadProgress">
      <a>選擇圖片文件<i class="progress" :style="{width:progress + '%'}"></i></a>
    </mo-upload>
    ...
  </section>
</template>
<script>
  import MoUpload from 'upload'
  export default {
    components : {
      MoUpload,
    },
    data () {
      return {
        thumbnail : null,
        progress : 0 //上傳進度
      }
    },
    methods : {
      uploadProgress (progress, flag) {
        //這里可以通過回調的flag對不同上傳域做處理
        this.progress = progress < 100 ? progress : 0;
      },
      uploadComplete(status, result, flag) {
        if (status == 200) { //
          this.thumbnail = `domain.com/${result.key}` //七牛域名 + 返回的key 組成文件url
        } else {
          //失敗處理
        }
      },
    }
  }
</script>

小結

相比于FILEApi 或者其他上傳組件,這種方法代碼量最小。但是缺點也是顯而易見的,大量html5 API的使用,勢必會回到兼容性這個老大難上來,慎重的選擇性使用吧‘

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • vue中的v-if基本使用(最新推薦)

    vue中的v-if基本使用(最新推薦)

    v-if根據表達式的真假,切換元素的顯示和隱藏操作DOM元素,這篇文章主要介紹了vue中的v-if基本使用,需要的朋友可以參考下
    2022-12-12
  • Vue中實現動態(tài)更新JSON數據的三種方式

    Vue中實現動態(tài)更新JSON數據的三種方式

    在 Vue 項目中動態(tài)更新 JSON 數據,可以通過以下幾種方式實現,具體方法取決于你的需求,比如數據是存儲在前端還是后端、是否需要持久化等,文中通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2025-04-04
  • Vue踩坑之Vue?Watch方法不能監(jiān)聽到數組或對象值的改變詳解

    Vue踩坑之Vue?Watch方法不能監(jiān)聽到數組或對象值的改變詳解

    Vue 提供了一種更通用的方式來觀察和響應 Vue 實例上的數據變動:偵聽屬性,下面這篇文章主要給大家介紹了關于Vue踩坑之Vue?Watch方法不能監(jiān)聽到數組或對象值的改變的相關資料,需要的朋友可以參考下
    2022-04-04
  • vuex的幾個屬性及其使用傳參方式

    vuex的幾個屬性及其使用傳參方式

    這篇文章主要介紹了vuex的幾個屬性及其使用傳參,本文結合實例代碼給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • c++游戲教程使用easyx做出大飛機

    c++游戲教程使用easyx做出大飛機

    這篇文章主要為大家介紹了c++游戲教程使用easyx實現大飛機示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • vue自定義封裝按鈕組件

    vue自定義封裝按鈕組件

    這篇文章主要為大家詳細介紹了vue自定義封裝按鈕組件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • vue使用swiper實現左右滑動切換圖片

    vue使用swiper實現左右滑動切換圖片

    這篇文章主要為大家詳細介紹了vue使用swiper實現左右滑動切換圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • vue3輸入無效路由跳轉到指定error頁面問題

    vue3輸入無效路由跳轉到指定error頁面問題

    這篇文章主要介紹了vue3輸入無效路由跳轉到指定error頁面問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vue3如何實現變量雙向綁定

    vue3如何實現變量雙向綁定

    這篇文章主要介紹了vue3如何實現變量雙向綁定問題,具有很好的參考價值,希望對大家有所幫助,
    2023-11-11
  • vue實現輪播圖片

    vue實現輪播圖片

    這篇文章主要為大家詳細介紹了vue實現簡單的輪播圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07

最新評論

大关县| 托克逊县| 且末县| 若尔盖县| 杭锦后旗| 和龙市| 景泰县| 台东市| 平安县| 滦平县| 青海省| 偃师市| 壶关县| 观塘区| 抚州市| 林州市| 叶城县| 邛崃市| 洛浦县| 永新县| 安岳县| 瑞安市| 定西市| 灌云县| 浦北县| 恭城| 兴山县| 兰坪| 黄浦区| 惠水县| 清新县| 儋州市| 平原县| 新蔡县| 固始县| 封丘县| 磐安县| 雅江县| 淄博市| 岳阳县| 东台市|