iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 5
4
Everything on Azure

三十天.NET❤️Azure漸進式開發專案系列 第 5

三十天.NET與Azure漸進式開發專案(5):WebJob+C#做排程器,更新server圖片到圖床

  • 分享至 

  • xImage
  •  

前篇以批次檔(bat)配合webjob做備份,今天換C#來做點複雜的
網頁常常有圖片上傳、保存到server的情況,造成伺服器的資源負擔

舉例
Blog圖片上傳到雲端伺服器 :
2018-10-10.21.36.38-image.png

當使用者流量變多的時候,為了避免流量負擔,通常會做CDN或是把圖片上傳到圖床,其中又以Imgur最為有名(免費、速度快)

這時候我們可以配合Azure的WebJob寫一個Loader程式,固定時間去抓取server的圖片上傳到imgur,把文章的圖片連結替換imgur的連結


建立C# Webjob

【第一步】建立一個"主控台應用程式"專案
2018-10-10.21.36.43-image.png

【第二步】申請Imgur的clientIdclientSecret > NuGet安裝Imgur.API
2018-10-10.21.36.46-image.png

【第三步】
寫圖片上傳程式,程式邏輯:

  1. 讀取Azure網頁圖片目錄D:\home\site\wwwroot\wwwroot\的圖片
  2. 上傳到Imgur
  3. 更新文章的連結
  4. 上傳成功後移到上傳成功資料夾
using Imgur.API.Authentication.Impl;  
using Imgur.API.Endpoints.Impl;  
using System;  
using System.IO;  
using System.Threading.Tasks;  
  
namespace WebJobUploadImagesToImgur  
{  
    class Program  
    {  
        static void Main(string[] args)
        {
            Console.WriteLine("Start");
            var rootPaht = "D:/home/site/wwwroot/wwwroot/"; //測試路徑var rootPaht = "C:/Users/HanYang/Downloads/imgs";

            //獲取目錄下所有png圖片
            var unUploadFloder = Path.Combine(rootPaht, "Posts/files");
            var uploadedFloder = Path.Combine(rootPaht, "Posts/UploadedImgs");
            System.IO.Directory.CreateDirectory(uploadedFloder);
            var filePaths = Directory.GetFiles(rootPaht, "*.png", SearchOption.AllDirectories);

            //上傳到Imgur,更新Blog的文章圖片路徑,接著移到上傳成功資料夾
            foreach (var path in filePaths)
            {
                string filename = Path.GetFileName(path);
                byte[] photo = File.ReadAllBytes(path);
                string imgurPath = UploadImgurImageByBytesAsync(photo).GetAwaiter().GetResult();
                string moveToPath = Path.Combine(uploadedFloder, filename);
                Console.WriteLine($"{photo.ToString()} UploadTo {imgurPath} And Move To {moveToPath}");

                if (ChangePostImgPathByImgurPath(path, imgurPath).GetAwaiter().GetResult())
                {
                    Console.WriteLine("Change Success");
                    File.Move(path, moveToPath);
                }
            }
            Console.WriteLine("End");
        }  
  
        private static async Task<string> UploadImgurImageByBytesAsync(byte[] bytes)  
        {  
            var client = new ImgurClient("clientId", "clientSecret");    
            var endpoint = new ImageEndpoint(client);  
            return (await endpoint.UploadImageBinaryAsync(bytes)).Link;  
        }  
  
        private static async Task<bool> ChangePostImgPathByImgurPath(string path, string imgurPath)  
        {  
            return /**文章更新連結**/;  
        }  
    }  
}  
  

【第四步】發布到Azure WebJob,流程:

  1. 點擊控制台專案,滑鼠右鍵選擇發行
  2. 選取現有
  3. 點選發佈
  4. 選擇指定的webapp
  5. 接著在發行目錄下,點擊發佈
    2018-10-10.21.36.56-image.png
    2018-10-10.21.37.00-image.png

【第四步】到Azure WebJob觀看紀錄,可以發現程式每15分鐘自動排程運行程式,幫忙把圖片上傳到imgur
2018-10-10.21.37.05-image.png

完成後可以看到文章的連結更換為圖床imgur連結
2018-10-10.21.37.18-image.png

補充

  1. 在AzureWebJob可以簡單建立Log,使用熟悉的Console.WriteLine就可以,如圖片
    2018-10-10.21.37.10-image.png
  2. 假如想要調整排程器間隔時間可以到Settings.job調整
    2018-10-10.21.37.14-image.png

結論

Azure Web App Service藉由WebJob提供不只網頁功能,也可以用控制台程式來靈活、高效率處理事情,像是筆者有使用壓縮圖片最佳化WebJob

以上傳公開圖床為例子,雖然有免費最大優點,但同樣有巨大缺點,假如有資安重要資料怎麼辦?,不小心上傳不就等於公告全世界

所以接著會介紹 Azure 提供的檔案服務(Azure Blob Storage)達到圖床目的又可以自由管理檔案,重點也有提供對應的SDK方便編寫快速開發


紀錄:第五天,Azure總花費金額:0


上一篇
三十天.NET與Azure漸進式開發專案(4):WebJob排程器自動Git備份
下一篇
三十天.NET與Azure漸進式開發專案(6):替換使用Azure Storage Blob保存圖片
系列文
三十天.NET❤️Azure漸進式開發專案30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言