用Github建立一個(gè)靜態(tài)圖片服務(wù)器 -- 上傳CLI

Github

上次說(shuō)道,我們用Github建立了一個(gè)服務(wù)器,我們把圖片放到你的倉(cāng)庫(kù)代碼庫(kù)下,然后將圖片push到Github遠(yuǎn)端服務(wù)器上,之后就可以訪問(wèn)你的圖片了。這次,我們?cè)囍詣?dòng)化這些步驟。(上文鏈接如下)

http://www.itdecent.cn/p/6954b58200f9

想要自動(dòng)話這個(gè)步驟,我們需要寫一些代碼,這里我選擇了Node.js,可以提供一些工具來(lái)操作文件還有下載圖片。并且在也很容易在本地運(yùn)行。并且Node.js也支持運(yùn)行Shell Script。

下面我們將這個(gè)流程分為下面幾個(gè)步驟:

  1. 從命令行讀取參數(shù)
  2. 下載圖片并存到設(shè)定的路徑下
  3. 將圖片push到Github的遠(yuǎn)端倉(cāng)庫(kù)下

從命令行讀取參數(shù)

Node.js命令如下所示

node upload.js --url https://any-image-host.com/static/images/image.png

之后我們可以讀取到URL參數(shù)并用來(lái)下載圖片到Github倉(cāng)庫(kù)下。

通常,我們可以從process.argv來(lái)讀取這些參數(shù),但是讀取的參數(shù)可讀性較低,因?yàn)閿?shù)據(jù)是存在數(shù)組里的,如下文所示:

[
  '/<path>/node',
  '/<path>/upload.js',
  '--url',
  'https://any-image-host.com/static/images/image.png'
]

所以我建議使用一個(gè)工具minimist,你可以通過(guò)npm來(lái)安裝,npm i minimist --save。這個(gè)工具可以幫你將參數(shù)整理成鍵值對(duì)的形式:

{
  _: [
    '/<path>/node',
    '/<path>/upload.js'
  ],
  url: 'https://any-image-host.com/static/images/image.png'
}

之后我們可以輕松的從minimist(process.argv).url來(lái)獲取數(shù)據(jù)。

下載圖片并存到設(shè)定的路徑下

拿到圖片的URL,我們就可以準(zhǔn)備下載圖片了。

首先,選擇一個(gè)路徑來(lái)存儲(chǔ)圖片,我比較傾向于下面這樣的路徑:

<project-path>/images/<timestamp>/<uuid>.<image-format>

首先我們需要?jiǎng)?chuàng)建文件夾<project-path>/images/<timestamp>,這里我們可以用shell script mkdir -p <project-path>/images/<timestamp>,但是我們?cè)?code>Node.js中使用shell script嗎?答案是:是的,我們可以通過(guò)下面打代碼來(lái)運(yùn)行shell script。

const exec = require('child_process').exec;

const sh = cmd => {
  return new Promise((resolve, reject) => {
    exec(cmd, (err, stdout, stderr) => {
      if (err) {
        reject(err);
      } else {
        resolve({ stdout, stderr });
      }
    });
  });
}

首先,從child_process模塊中引入exec方法,這個(gè)模塊是包括在Node.js中,我們不需要再另外安裝。然后他可以接受一個(gè)shell script命令作為參數(shù)并執(zhí)行它。

在這里我們只需要執(zhí)行sh('mkdir -p <project-path>/images/<timestamp>'),文件夾便被創(chuàng)建出來(lái)了。

之后,我們便可以下載圖片了。這里我們使用了image-downloader模塊,通過(guò)npm i image-downloader --save可以安裝它。其API使用方式比較簡(jiǎn)單,eg.

  const downloader = require('image-downloader')
  const options = {
    url,
    dest: path.resolve(__dirname, `${dir}/${name}`),
    extractFilename: false,
  }
  return downloader.image(options)
    .then(({ filename, image }) => {
      console.log('The image is saved to', filename);
      console.log('The image is at', `https://raw.githubusercontent.com/<your-git-username>/static-images/master/images/v2/${timestamp}/${name}`);
    })

如果你想了解更多關(guān)于image-downloader的內(nèi)容, 可以訪問(wèn)https://www.npmjs.com/package/image-downloader

將圖片push到Github的遠(yuǎn)端倉(cāng)庫(kù)下

拿到圖片后,最后一步就是發(fā)布這些圖片。

這步很簡(jiǎn)單,因?yàn)槲覀兦懊嬉呀?jīng)配置好sh方法來(lái)執(zhí)行命令行腳本,我們我們可以如下配置命令:

const command = `
  git add --all; \
  git commit -m "Add image"; \
  git push origin master});
`
sh(command)

之后如果你的Git工作正常,應(yīng)該可以看到你的圖片已經(jīng)被發(fā)布到Github上了。

疑難排解

我在這個(gè)過(guò)程中面對(duì)的最大的問(wèn)題是在下載圖片的時(shí)候,有時(shí)候會(huì)遇到CONNECTION REFUSED 0.0.0.0:443的錯(cuò)誤,但是將URL輸入到瀏覽器中則可以看到圖片,這種情況下是由于DNS不能正確的解析域名導(dǎo)致的,你可以嘗試換一個(gè)DNS服務(wù)器比如114.114.114.114,如果你覺得這樣比較費(fèi)時(shí)間,對(duì)于這樣的圖片你也可以手動(dòng)下載。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容