前端如何上傳圖片到七牛云

前端如何上傳圖片到七牛云

流程:
1砌些、七牛云后臺(tái)的對(duì)象存儲(chǔ)功能
2、node.js后臺(tái)生成七牛云的token
3、前端利用element UI/ice 的upload組件
4浊服、文件名和token作為參數(shù)請(qǐng)求到七牛云后臺(tái)

第一步 node.js后臺(tái)生成七牛云的token

token

const accessKey = 'TSlScX_akS5TIpsXlkq*****7Efk-ZaZeg4ZWtta';
const secretKey = 'X-MGLySWVrWFIQKTn***WDIBvb3ni4Zm3qwZNKxk';
const bucket = 'deluntiyun';
如何獲取這三個(gè)參數(shù)
image.png

accessKey 就是AK
secretKey 就是SK


image.png

bucket 就是你的空間名字

我的token是koa后臺(tái)請(qǐng)求回來的,附上代碼 node的話qiniu模塊
非node的話自行查詢Node.js SDK

let qiniu = require('qiniu'); // 需要加載qiniu模塊的
const accessKey = 'TSlScX_akS5TIpsXl****gy7Efk-ZaZeg4ZWtta';
const secretKey = 'X-MGLySWVrWFI****87HWDIBvb3ni4Zm3qwZNKxk';
const bucket = 'deluntiyun';


router.post('/token', async(ctx, next)=> {
    let mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
    let options = {
        scope: bucket,
        expires: 3600 * 24
    };
    let putPolicy =  new qiniu.rs.PutPolicy(options);
    let uploadToken= putPolicy.uploadToken(mac);
    if (uploadToken) {
        ctx.body = Code('re_success', uploadToken)
    } else {
        ctx.body = Code('re_error')
    }
})

token也是在前端來生成的胚吁, 加載qiniu模塊牙躺,利用其方法就可以生成token

第二步 上傳到七牛云 - React

upload組件 ice Upload 上傳組件

// 用來刪除圖片的
onUploadChange(info) {
        if (info.file.status == 'removed') {
            this.setState({
                fileList: [],
                values: Object.assign({
                    avatar: ''
                })
            })
        }
  }

<Col xxs="16" s="10" l="6">
                  <IceFormBinder name="avatar" required message="必填">
                    <ImageUpload
                      listType="picture-card"
                      limit={1}
                      action={this.state.qiniu.url}
                      fileList={this.state.fileList}
                      accept="image/png, image/jpg, image/jpeg, image/gif, image/bmp"
                      data={this.state.qiniuToken}
                      locale={{
                        image: {
                          cancel: '取消上傳',
                          addPhoto: '上傳圖片',
                        },
                      }}
                      formatter={(res)=>{
                            // 七牛云返回的數(shù)據(jù)  { hash:"FjIEDVNzhgmsU7cOBtkAXV7VuhvJ",key:"FjIEDVNzhgmsU7cOBtkAXV7VuhvJ"}
                            let imgURL = this.state.qiniu.qiniuPath + "/" + res.key;
                            this.setState({
                                    fileList: [{
                                        status: "done",
                                        downloadURL: imgURL,
                                        fileURL: imgURL,
                                        imgURL: imgURL
                                    }],
                                    value: Object.assign(this.state.value, {
                                        avatar: imgURL
                                    })
                                })
                      }}
                      onChange= {this.onUploadChange.bind(this)}
                    />
                  </IceFormBinder>
                </Col>

附上網(wǎng)友大神的ice組件代碼腕扶,雖然不是用七牛云的

52A911F6-D3A8-4cb0-A041-202644CCA761.png

第二步 上傳到七牛云 - Vue

ui框架 element-ui el-upload

koa2 請(qǐng)求到七牛云的token

let qiniu = require('qiniu'); // 需要加載qiniu模塊的
const router = require('koa-router')()
router.prefix('/api/admin/qiniu')

let config = {
    "AK":"TSlScX_akS5TIpsXlkqHH2gy7Efk-ZaZeg4ZWtta",
    "SK":"X-MGLySWVrWFIQKTn87HWDIBvb3ni4Zm3qwZNKxk",
    "Bucket":"mobile-phone-shell"
}

router.post('/token', async(ctx, next)=> {
    let mac = new qiniu.auth.digest.Mac(config.AK, config.SK);
    let code = '1',msg = '', data = {};
    let options = {
        scope: config.Bucket,
        expires: 3600 * 24
    };
    let putPolicy =  new qiniu.rs.PutPolicy(options);
    let uploadToken= putPolicy.uploadToken(mac);
    if (uploadToken) {
        code = '0';
        data.uploadToken = uploadToken;
        ctx.body = {code, data, msg}
    } else {
        ctx.body = {code, data, msg}
    }
})

module.exports = router

前端代碼

<el-upload
<el-upload
                      style='position: relative;top: 10px;height: 120px;'
                      :file-list='fileList'
                      class="avatar-uploader"
                      :limit='1'
                      :action="uploadUrl"
                      accept="image/jpeg,image/gif,image/png,image/bmp"
                      list-type="picture-card"
                      :data='uploadData'
                      :on-success="handleAvatarSuccess"
                      :on-error="uploadError"
                      :before-upload="beforeAvatarUpload"
                      :on-preview="doLookImg"
                      :on-remove="doDeleteImg">
                      <i class="el-icon-plus"></i>
                    </el-upload>
<script>
  export default {
    data() {
      return {
          uploadUrl: 'http://up-z0.qiniu.com',
          uploadData: {key:'',token:''},
          formAdd: { brandLogo: '' }
      }
    },
    mounted() {
        getQiniuToken({}).then((res)=> {
          console.log(res);
          if (res.code === '0') {
            this.uploadData.token = res.data.uploadToken
          }
        })
  },
    methods: {
      doDeleteImg(file, fileList) {
        console.log('刪除成功',file, fileList)
        let logoAry;
        let key;
        if (this.editState) {
          logoAry = this.mainInfo.brandLogo.split('/');
        } else {
          logoAry = this.formAdd.brandLogo.split('/');
        }
        key = logoAry[logoAry.length - 1];
        deleteQiniuImg({key}).then(res=> {
          if (res.code === '0') {
            if (this.editState) {
              this.mainInfo.brandLogo = '';
            } else {
              this.formAdd.brandLogo = '';
            }
          } else {
            this.$message.error(res.msg)
          }
        })
      },
      doLookImg() {
        this.uploadDialogVisible = true;
        this.uploadDialogImg = this.editState ? this.mainInfo.brandLogo : this.formAdd.brandLogo;
      },
      handleAvatarSuccess(res, file, fileList) {
        console.log('上傳成功', res,file, fileList)
        let hash = res.hash;
        let key = res.key;
        if (this.editState) {
          this.mainInfo.brandLogo = qiniuConfig.qiniuPath + '/' + key;
        } else {
          this.formAdd.brandLogo = qiniuConfig.qiniuPath + '/' + key;
        }
      },
      beforeAvatarUpload(file) {
        console.log(file, 'beforeAvatarUpload')
        // var observable = qiniu.upload(file, key, token, putExtra, config)
        const isPNG = file.type === "image/png";
        const isJPEG = file.type === "image/jpeg";
        const isJPG = file.type === "image/jpg";
        const isLt2M = file.size / 1024 / 1024 < 2;

        if (!isPNG && !isJPEG && !isJPG) {
          this.$message.error("上傳頭像圖片只能是 jpg孽拷、png、jpeg 格式!");
          return false;
        }
        if (!isLt2M) {
          this.$message.error("上傳頭像圖片大小不能超過 2MB!");
          return false;
        }
        this.uploadData.key = `upload_pic_${new Date().getTime()}_${file.name}`;
      },
      uploadError(err, file, fileList) {
        this.$message({
          message: "上傳出錯(cuò)半抱,請(qǐng)重試脓恕!",
          type: "error",
          center: true
        });
      },
    }
}
</script>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市窿侈,隨后出現(xiàn)的幾起案子炼幔,更是在濱河造成了極大的恐慌,老刑警劉巖史简,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乃秀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡圆兵,警方通過查閱死者的電腦和手機(jī)跺讯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來殉农,“玉大人刀脏,你說我怎么就攤上這事〕剩” “怎么了愈污?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵危队,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我钙畔,道長(zhǎng)茫陆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任擎析,我火速辦了婚禮簿盅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘揍魂。我一直安慰自己桨醋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布现斋。 她就那樣靜靜地躺著喜最,像睡著了一般。 火紅的嫁衣襯著肌膚如雪庄蹋。 梳的紋絲不亂的頭發(fā)上瞬内,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音限书,去河邊找鬼虫蝶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛倦西,可吹牛的內(nèi)容都是我干的能真。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼扰柠,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼粉铐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起卤档,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蝙泼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后裆装,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踱承,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年哨免,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昙沦。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡琢唾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盾饮,到底是詐尸還是另有隱情采桃,我是刑警寧澤懒熙,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站普办,受9級(jí)特大地震影響工扎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜衔蹲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一肢娘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舆驶,春花似錦橱健、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至撬陵,卻和暖如春珊皿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辙谜,地道東北人崖飘。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像铆铆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容