iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 5
2
Everything on Azure

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

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

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

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

舉例
我在電腦寫文章上傳到Blog,圖片傳到server保存圖片
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.選取現有的app service
3.點選發佈
4.選擇指定的webapp
5.接著發行到Azure
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

補充

一.在AzureWebJob可以簡單建立Log
使用熟悉的Console.WriteLine就可以,如圖片
2018-10-10.21.37.10-image.png

二.假如想要調整排程器間隔時間可以到Settings.job調整
2018-10-10.21.37.14-image.png

結果

登登登,可以看到文章的連結更換到圖床imgur
2018-10-10.21.37.18-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漸進式開發專案10

尚未有邦友留言

立即登入留言