用七牛云拖拽上傳圖片,返回圖片url或markdown

本文首發(fā)于個(gè)人博客https://www.kagurakana.xyz/detail/e169338c7,如果對(duì)您有幫助,或者任何建議,請(qǐng)務(wù)必在小站流言,一起做朋友呀~~

圖床介紹

圖床是我這種小博客賴以生存的工具,他可以托管圖片,減輕我的1核2g的辣雞服務(wù)器的壓力.目前我使用過的圖床有sm.ms,和七牛cdn,而七牛不只可以托管圖片,還可以托管各種靜態(tài)資源,例如音頻和視頻等.并為其綁定加速域名.以下主要介紹七牛JavaScript-sdknode-sdk.因?yàn)楸静┛筒捎昧薾ode作為后端.

十分雞肋的是七牛cdn每個(gè)月只有10g的靜態(tài)資源存儲(chǔ)空間(不累加),用超出去會(huì)每個(gè)月交錢(10G大概1.5元,如果每個(gè)月存儲(chǔ)100G也就15塊),其他的作為小站來說基本不可能達(dá)到,具體資費(fèi)請(qǐng)參照官網(wǎng).

chrome_iGMDgPtqFk.png

準(zhǔn)備工作

1. 注冊(cè)七牛賬號(hào),創(chuàng)建存儲(chǔ)空間bucket

首先選擇對(duì)象存儲(chǔ),并創(chuàng)建存儲(chǔ)空間.

chrome_tPsQSMPhwU.png

點(diǎn)擊新建空間,進(jìn)行一些簡(jiǎn)單的配置,如選擇存儲(chǔ)地理位置等,配置完成后就會(huì)看到下面的存儲(chǔ)空間,此時(shí)已經(jīng)可以手動(dòng)添加圖片進(jìn)去了.

chrome_spZdtbGhRT.png

2. 綁定域名加速

在創(chuàng)建好bucket也就是存儲(chǔ)空間之后,可以進(jìn)行域名加速綁定,好處是可以使用自己的域名進(jìn)行圖片獲取和上傳.


chrome_o0NX6vqF8Y.png

綁定的域名需要在大陸進(jìn)行ICP備案,我的域名是kagurakana.xyz,在阿里云購買,SSL證書是阿里云免費(fèi)個(gè)人版證書,這種證書只支持單域名,不支持泛域名(*.domain.com),如果你和我一樣需要https協(xié)議來存儲(chǔ)你的圖片,除了本站域名(kagurakana.xyz)需要申請(qǐng)SSL證書之外,cdn域名(我的是cdn.kagurakana.xyz,可以在阿里云的dns解析中配置)也要申請(qǐng)SSL證書,假設(shè)你現(xiàn)在已經(jīng)有了yourdomain.comcdn.yourdomain.com的ssl證書.且主站yourdomain.com已經(jīng)在域名購買商的dns解析中和Nginx服務(wù)器中完成了配置(如何在主站中配置https和Nginx部署SSL我會(huì)在最近寫一篇文章介紹),那么只需要關(guān)注cdn.yourdomain.com的證書就好了,這個(gè)不需要進(jìn)行配置,只要下載下來復(fù)制到七牛cdn中就好了,我會(huì)在后面介紹.

2.1 配置七牛云域名加速

chrome_WYiIb788pk.png

可以按照喜好自行配置.

2.2 *申請(qǐng)?jiān)撚蛎腟SL(HTTPS需要/HTTP可跳過)

在阿里云申請(qǐng)個(gè)人免費(fèi)版SSL證書,填寫證書域名為cdn.yourdomain.com,其他默認(rèn)就好,證書文件會(huì)自動(dòng)關(guān)聯(lián)到到你的cdn域名下.下載Nginx版的證書文件,其中會(huì)有一個(gè).pem文件和一個(gè).key文件.先保存在本地.

2.3 *在七牛CDN導(dǎo)入證書文件(HTTPS需要/HTTP可跳過)

chrome_MPTjJAsOaU.png

把剛才先下載的.pem中的內(nèi)容用編輯器打開,復(fù)制到證書內(nèi)容一欄,把.key文件打開復(fù)制到證書密鑰一欄,點(diǎn)添加.添加完成后應(yīng)該可以看到cdn頁面下的https證書多了一個(gè)可以選的,選擇那個(gè).

chrome_a04alRhV4K.png

后面的原站配置選擇七牛云存儲(chǔ),其他選擇默認(rèn)或者推薦就好.在高級(jí)配置中可選擇域名防盜鏈,防止被引用過多產(chǎn)生更多費(fèi)用,我配置了本站(kagurakana.xyz)和簡(jiǎn)書和七牛云這三個(gè).

2.4 配置阿里云域名的DNS解析

在七牛的cdn配置完之后,要將圖片cdn和主站DNS進(jìn)行關(guān)聯(lián),在七牛完成之后,可以得到一個(gè)CNAME值,復(fù)制這個(gè)CNAME


chrome_FCmpI6O6RS.png

上到阿里云的控制臺(tái),找到DNS,記錄類型選擇CNAME,將剛才的CNAME填入下面的記錄字中.

chrome_7pur89ofNn.png

等待DNS服務(wù)器更新(TTL時(shí)間)后,可以看到狀態(tài)從等待CNAME成為了成功.

chrome_5AFyqj141Y.png

至此,準(zhǔn)備階段的工作全部完成,你可以用你自定義的域名來訪問上傳的圖片了,然而這是不夠的.我們還要解決圖片拖拽自動(dòng)上傳的功能.

使用JavaScript-SDK和node-SDK完成自動(dòng)上傳

node-SDK文檔

js-SDK文檔

1. 后端鑒權(quán)

安裝七牛cdn

npm install qiniu --save

創(chuàng)建qiniu.config.js文件:

// /config/qiniu.config.js
module.exports = {
  accessKey: '在七牛個(gè)人信息密鑰管理中可以找到',
  secretKey: '在七牛個(gè)人信息密鑰管理中可以找到',
  domain: '在bucket管理界面可以找到,可以看下面的圖片',
  options: {
    scope: "kagurakana",//你的bucket空間的名稱
    expires: 3 * 3600,//單次鑒權(quán)有效期,在申請(qǐng)鑒權(quán)的多少喵內(nèi)可以上傳,可缺省,默認(rèn)為1小時(shí)

//自定義返回參數(shù),在上傳成功后返回給前端,注意是字符串類型,是$()小括號(hào)不是大括號(hào),大括號(hào)沒試過不知道行不行.
//其中$(key),$(bucket),$(fname)是七牛中的默認(rèn)變量
//
    returnBody: `{"key":"$(key)",
                 "bucket":"$(bucket)",
                 "name":"$(fname)"}`
  }
}
chrome_771RGGm0ZZ.png

更詳細(xì)的配置可以在官網(wǎng)里找到,這里只列的我的配置.

在router中引入

// /routes/update.js
let express = require('express');
let router = express.Router()

//導(dǎo)入之前的config
let opt = require('../config/qiniu.js')
let qiniu = require('qiniu');

//我自己的管理員權(quán)限認(rèn)證中間件
const {loginCheckAdmin} = require('../midware/midware')

// 定義鑒權(quán)對(duì)象mac
let mac = new qiniu.auth.digest.Mac(opt.accessKey,opt.secretKey)

// 定義上傳憑證
let putPolicy = new qiniu.rs.PutPolicy(opt.options)
let uploadToken = putPolicy.uploadToken(mac)

//處理get獲取上傳鑒權(quán)認(rèn)證,我這里是管理員才能上傳
//你也可以寫中間件只能讓注冊(cè)用戶上傳.或者開放上傳(避免濫用不推薦)

router.get('/uptoken',loginCheckAdmin,(req,res,next)=>{
  res.header("Cache-Control", "max-age=0, private, must-revalidate");
  res.header("Pragma", "no-cache");
  res.header("Expires", 0);
  if(uploadToken) {
      res.json({uploadToken});
  }
})


module.exports = router;

后端最簡(jiǎn)單的配置已經(jīng)結(jié)束了,如果還需要添加文字或圖片水印,裁剪圖片,加濾鏡,生成縮略圖,覆蓋重復(fù)文件可以參考node-SDK文檔
.

2. 前端上傳

前端使用了vue+axios,可以根據(jù)配置自行修改

npm install qiniu-js --save

封裝網(wǎng)絡(luò)請(qǐng)求請(qǐng)求鑒權(quán)

//封裝網(wǎng)絡(luò)請(qǐng)求request方法,僅提供參考.
//  network/request.js
import axios from 'axios'
axios.defaults.withCredentials=true;//配置axios攜帶cookie


export function request(config){
  const instance = axios.create({
    baseURL:'https://yourdomaim.com/apis',
    timeout:5000
  })
//攔截
  instance.interceptors.response.use(res=>{
    if(res.data.errno!=404){
      return res.data;
    }else{
      window.location.replace('/home')
    }
  })
  return instance(config) 
}
// network/imgUpdate.js

import { request } from './request'


export function getUploadToken(){
  return request({
    method:'get',
    url:'你的后端接口/uptoken'
  })
}

拖拽上傳

首先來看一下sdk提供的上傳函數(shù):

qiniu.upload(file: blob, key: string, token: string, putExtra: object, config: object): observable`

上面的關(guān)鍵函數(shù)返回一個(gè)觀察者對(duì)象(observable),該對(duì)象具有訂閱(subscribe)方法,subscribe方法接收三個(gè)函數(shù)作為參數(shù),分別在上傳中,上傳失敗,上傳成功后調(diào)用.

//界面.vue
<template>
  <!-- 監(jiān)聽拖放事件 -->  
  <v-textarea @drop.prevent.stop="imgDrop" v-model="content" label="content"></v-textarea>
</template>

<script>
import { getUploadToken } from "network/imgUpdate";
import * as qiniu from "qiniu-js";

export default {
  name: "BlogPost",
  data() {
    return {
      upToken: "",
      content:""
    };
  },

  created() {
      getUploadToken().then(res => {
        //獲取后臺(tái)返回的七牛cdn uptoken
        this.upToken = res.data.uploadToken;
      });
  },
  methods: {
//這三個(gè)方法作為參數(shù)給七牛觀察方法傳遞的,不能缺省

    //上傳錯(cuò)誤處理調(diào)用的(七牛返回的錯(cuò)誤信息)
    next(res){
      //可以自己log下res,是上傳的進(jìn)度什么的;
    },
    error(err) {
      console.log(err); 
    },
     //成功處理后調(diào)用的方法
    complete(res) {
      //url拼接,返回markdown格式字符串,content是雙向綁定數(shù)據(jù),更進(jìn)一步,你可以根據(jù)輸入的光標(biāo)位置決定markdown位置
      this.content += `![${res.name}](https://cdn.kagurakana.xyz/${res.name})`;
    },


    /**拖放監(jiān)聽處理chorme,其他未做適配 */
    imgDrop(e) {
//這里如果console.log(e)里面dataTransfer的files數(shù)組是空的,不用管
      let file = e.dataTransfer.files[0]; //獲取拖放文件 Blob
      if (this.upToken) {

      //函數(shù)格式:qiniu.upload(file: blob, key: string, token: string, putExtra: object, config: object): observable

        let observable = qiniu.upload(
          file,
          file.name,
          this.upToken,
          { fname: file.name, params: {}, mimeType: null }, //putExtra
          { useCdnDomain: true } //config
        );

        //開始上傳
        observable.subscribe(this.next,this.error,this.complete);
      }
    }
  }
};
</script>

<style lang='scss' scoped>
</style>

看一下效果:

JHCvDCqov7.gif

更進(jìn)一步,你可以添加剪貼板上傳圖片而不是拖拽上傳,或者根據(jù)光標(biāo)位置插入markdown而不是在末尾插入.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浓镜,一起剝皮案震驚了整個(gè)濱河市谤逼,隨后出現(xiàn)的幾起案子幅恋,更是在濱河造成了極大的恐慌笑诅,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡仅孩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門印蓖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辽慕,“玉大人,你說我怎么就攤上這事赦肃”前伲” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵摆尝,是天一觀的道長(zhǎng)温艇。 經(jīng)常有香客問我,道長(zhǎng)堕汞,這世上最難降的妖魔是什么勺爱? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮讯检,結(jié)果婚禮上琐鲁,老公的妹妹穿的比我還像新娘卫旱。我一直安慰自己,他們只是感情好围段,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布顾翼。 她就那樣靜靜地躺著,像睡著了一般奈泪。 火紅的嫁衣襯著肌膚如雪适贸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天涝桅,我揣著相機(jī)與錄音拜姿,去河邊找鬼。 笑死冯遂,一個(gè)胖子當(dāng)著我的面吹牛蕊肥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蛤肌,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼壁却,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了裸准?” 一聲冷哼從身側(cè)響起儒洛,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狼速,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卦停,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡向胡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惊完。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片僵芹。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖小槐,靈堂內(nèi)的尸體忽然破棺而出拇派,到底是詐尸還是另有隱情,我是刑警寧澤凿跳,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布件豌,位于F島的核電站,受9級(jí)特大地震影響控嗜,放射性物質(zhì)發(fā)生泄漏茧彤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一疆栏、第九天 我趴在偏房一處隱蔽的房頂上張望曾掂。 院中可真熱鬧惫谤,春花似錦、人聲如沸珠洗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽许蓖。三九已至蝴猪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛔糯,已是汗流浹背拯腮。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚁飒,地道東北人动壤。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像淮逻,于是被迫代替她去往敵國(guó)和親琼懊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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

  • 一爬早、總目錄 1哼丈,資源主頁 資源主頁:用于添加七牛各個(gè)產(chǎn)品模塊,包含有:對(duì)象存儲(chǔ)筛严、自定義數(shù)據(jù)處理V2醉旦、多媒體處理、融...
    森林死了一只熊閱讀 2,242評(píng)論 0 4
  • 前言 該文章并不涉及到code-push-server服務(wù)的搭建過程桨啃,官方使用docker創(chuàng)建很簡(jiǎn)單车胡,一直使用的服...
    yz1311閱讀 595評(píng)論 0 0
  • 對(duì)象存儲(chǔ) 1.1新建空間(創(chuàng)建空間,例如img照瘾、video匈棘、txt倉庫) 2、融合cdn 2.1域名管理 2.2添...
    心魔_398a閱讀 874評(píng)論 0 0
  • 本文章以比較通俗的語言講述下 CDN 是什么析命,CDN 為什么能加速網(wǎng)站訪問主卫,為什么大部分網(wǎng)站都要使用 CDN,涉及...
    伯虔閱讀 1,080評(píng)論 0 1
  • 這天氣還要冒著雨搭車去送紅包 我都被自己感動(dòng)了 哎喲有車真好 呆站在馬路邊看車來車往卻沒有760的我 如是說
    三言兩語啰啰嗦嗦閱讀 129評(píng)論 0 0