阿里oss上傳圖片react組件alioss-react,vue組件alioss-vue (不用我先收藏着,后端看下前端處理方法)


 

1、介紹

 

  最近開發了一個項目,其中需要一個上傳圖片到阿里雲的 oss 上面,就是上傳圖片到阿里雲的 oss 上面。

  因為之前開發過 vue 的阿里雲 oss 上傳,所以直接復制粘 vue 的組件。

  因為我做的是 react 的項目,所以需要稍微修改。

  介於以后會經常用到,所以決定將它封裝成組件,並且添加到 npm 包里面。

 

  xl_alioss_vue  :  這個是 vue 的 NPM 包

  xl_alioss_react : 這個是 react 的 NPM 包

 

2、項目的安裝和預覽

 

  xl_alioss_vue 的安裝和應用

 

  安裝:

yarn add xl_alioss_vue

  

  使用:

<template>
    <FileUpload url="http://127.0.0.1:8081/common/upload/alioss/vue"
                v-on:upLoadImgEnd="upLoadImgEnd"
                v-on:upload="upload" >
      <img v-if="imgUrl" :src="imgUrl" alt="">
      <p v-if="!imgUrl">點擊上傳</p>
    </FileUpload>
</template>
<script>
 // 引入 xl_alioss_vue import FileUpload from 'xl_alioss_vue' export default { components: { FileUpload }, data() { return { imgUrl:'' } }, methods:{ upLoadImgEnd(data){ this.imgUrl = data }, upload(data,file,startLoad){ upload(Object.assign({},data,{file})) } }, created() { }, } </script>

  

  這里可以看到 xl_alioss_vue 插件有三個屬性:

  •  url :這個url 是請求一些 alioss 認證的信息的。( 由開發后端提供,后面將alioss 時候,介紹下 ) 

  • upLoadImgEnd(data)  上傳結束后函數,data 為返回的圖片 url

  • upload (data,file,startLoad)   這里如果沒有的這個屬性的話,會直接上傳,不需要startLoad

    • data : 是后端返回的 alioss 的認證信息

    • file :  上傳文件

    • startLoad : 開始上傳函數

 

  這里是上傳時候數據結構。

  所有在這里添加了一個數據處理的函數 upload 進行中轉,就是為了把數據處理為一下格式

 

data = {
  accessid,
  policy,
  signature,
  dir,
file,
}

 

 

   如果這里沒有 upload 屬性將不會去特意處理后端返回的 alioss 信息。

 直接去傳入后端返回的 alioss 數據信息進行圖片上傳

 可以能會出現數據結構不正確而報錯。

 

  預覽效果:

 

  

    

  xl_alioss_react 的安裝和應用

 

  安裝:

yarn add xl_alioss_react

  

  使用:

import React from 'react';
import FileUpload from 'xl_alioss_react'

export default class Main extends React.Component {
    state = {
        imgUlr:''
    }
    render() {
        return (
            <div style={{padding:30,fontSize:30}}>
                <FileUpload
                    url='http://127.0.0.1:8088/common/upload/alioss/vue'
                    uploadEnd={(data) => {
                        this.setState({
                            imgUlr:data
                        })
                    }}
                    upload={(data, file, load) => {
                         load(Object.assign({}, data, {file}))
                    }}
                >
                    上傳
                </FileUpload>
                <div>
                    {this.state.imgUlr?
                        <img src={this.state.imgUlr} alt=""/>:''}
                </div>
            </div>
        )
    }
}

  

  這里的三個屬性和 vue 組件是相同的,所以不做多的解釋。

 

  預覽效果:

 

 

 

  開發組件需要的知識:

  1、阿里雲 oss 上傳方法

  2、vue 和 react 的相關知識

 

 

3、阿里雲 oss 對象存儲  

 

  介紹

  阿里雲對象存儲服務(Object Storage Service,簡稱 OSS),是阿里雲提供的海量、安全、低成本、高可靠的雲存儲服務。

  您可以通過調用 API,在任何應用、任何時間、任何地點上傳和下載數據,也可以通過 Web 控制台對數據進行簡單的管理。

  OSS 適合存放任意類型的文件,適合各種網站、開發企業及開發者使用

  我們可以把我們的靜態資源存放在上面。

  並且 oss 有各種優勢:

  方便、快捷的使用方式

  強大、靈活的安全機制

  豐富、強大的增值服務

 

  具體了解,請求瀏覽阿里雲對象存儲 : 對象存儲

 

  上傳圖片相關知識介紹

  

  這里我們引用到的是阿里雲 oss 的 web 端上傳

  關於前端上傳阿里雲一共提供了四種方法:

  web 端直傳

  Javascript 客戶端簽名直傳

  服務器簽名后直傳

  服務器簽名直傳設置回調上傳

 

  如果想了解更多的知識,可以自己瀏覽相關文章。

  本文章的組件都是基於 服務器簽名后直傳 的。

 

  服務器簽名直傳

 

  原理介紹:

  服務端簽名后直傳的邏輯圖如下:


 

 

  流程如下:

  1. 用戶發送上傳Policy請求到應用服務器。

  2. 應用服務器返回上傳Policy和簽名給用戶。

  3. 用戶使用Plupload直接上傳數據到OSS。

 

  因為我們是大前端,所以后端的我就不解釋了。。

  后端的老板可以看案例,非常齊全

 

  在這里着重介紹一下后端返回的 Policy 信息

  返回的結構:

 

{
  accessid // 阿里雲分配的 Access Key Id
  policy   // 生產的認證信息
  signature  // 計算處理的簽名
}

 

  上面的數據是直傳 oss 所需要的數據

  如下:

 

let curDate = new FormData()
const key = options.dir + new Date().getTime() + '_' + options.file.name
curDate.append("OSSAccessKeyId", options.accessid);
curDate.append("policy", options.policy);
curDate.append("Signature", options.signature);
curDate.append("key", key);
curDate.append("success_action_status", '200');
curDate.append('file', file)

  

  這是直傳的時候需要的數據。

 

  阿里雲 oss 相關的知識已經介紹完成。。

 

 

4、node 作為服務端生產 Policy

 

  預備知識:

  1、express  后端基於 node 的應用開發框架

  2、node - crypto  用於加密解密模塊

  3、阿里雲加密生產 Policy 的知識 ( 這個沒有找到文檔,我是通過 PHP 案例修改的 )

 

  開發及其詳解

router.get('/alioss/vue', (req, res) => {
    let time = new Date(new Date().getTime() + 30000).formatDate('yyyy-MM-ddThh:mm:ssZ')
    let policyObj = JSON.stringify({
        "expiration": time,
        "conditions": [
            // 文件大小
            ["content-length-range", 0, 1048576000],
    
            ["starts-with", "$key", dir]
        ]
    })
    let policy = new Buffer(policyObj).toString('base64');
    let signature = crypto.createHmac('sha1', 'OEwkBpLfdoHCAbAoWXt5XFe4tiUwhX').update(policy).digest().toString('base64');
    res.end(JSON.stringify(
        {
            accessid: 'LTAIhf0LGhtEKTe8',
            host:aliossHost,
            dir,
            policy,
            expire:time,
            signature
        }
    ));
})

  

  詳解:

let time = new Date(new Date().getTime() + 30000).formatDate('yyyy-MM-ddThh:mm:ssZ')

  生成一個過期時間 

  這里是用當前時間加上 30 秒,提供給 Policy 對象

 

let policyObj = JSON.stringify({
        "expiration": time,
        "conditions": [
            // 文件大小
            ["content-length-range", 0, 1048576000],
    
            ["starts-with", "$key", dir]
        ]
    })

  定義 Policy 對象

  expiration : 這個是過期時間

  conditions : 一些規則數組

  content-length-range : 文件的長度范圍

  starts-with :  只能上傳某一個目錄,這里是 dir 目錄

 

let policy = new Buffer(policyObj).toString('base64');

  將 Ploicy 對象轉為 base64 字符串。

 

    let signature = crypto.createHmac('sha1', key ).update(policy).digest().toString('base64');

  這里由 policy 對象的 base64 的字符串 、阿里雲oss 的 key 通過 crypto 進行 sha 加密,

  返回 base64 的加簽字符串

 

res.end(JSON.stringify(
    {
        accessid: id,
        host:aliossHost,
        dir,
        policy,
        expire:time,
        signature
    }
));

  

  accessid : 阿里雲提供的 AccessId

  host : 上傳到阿里雲到地址

  dir :要上傳到目錄

  policy : oss 需要到憑證

  expire : 過期時間

  signature : 加簽到字符串  

 

  node 的加密模塊基本完成,這里可以直接引用。

 

 

5、前端代碼開發

  這里只會介紹 vue 的組件開發。

 

  組件的模版:

 

  介紹:

  <slot></slot> : 這里有一個 slot 插槽,是用來存放自組件的。這樣我們點擊該組件包裹的元素都是可以觸發上傳的

  input : 適用於來上傳的 form 表單

 

  js 模塊介紹

 

  介紹:

  uloadImg : 很顯然這里的這個方法是觸發上傳動作的

  doUpload : 這里是和后端交互,獲取 oss 上傳的憑證

  uploadOss : 這里是得到 oss 上傳憑證后,上傳到 oss 上面。

 

  大概介紹了下...

 

  具體代碼源碼: vue/axios實現阿里雲oss的圖片上傳組件

 

 小結巴巴博客園 https://www.cnblogs.com/jiebba/p/9597995.html 

   XiaoLong's Blog

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM