爲何要使用圖片服務器?把圖片放到本地不就行了? 項目小的時候,這樣作固然沒有問題;項目大了服務多了,還這樣作問題就出來了。好比:
須要使用縮略圖,各個帶圖片的服務須要本身實現縮略圖功能。
服務引用其餘服務圖片時,確認使用哪一個域名是個問題(測試環境域名?生產環境域名?換域名了更麻煩)。
各服務的承載服務器都要留出放圖片的空間,不易管理。
研發沒有服務器的權限,想管理圖片時只能找 IT 部門。
……
那咱們 .Neter 適合作一個什麼樣的圖片服務器呢?以前本身寫過圖片服務器,只是簡單的把圖片存起來,須要縮略圖的時候讀取出來,裁一下。可是研究了各類方案後,仍是以爲 Minio + ImageProxy 的方案是最好的,效率、擴展性、學習曲線幾個方面都很好。如何快速在項目中集成這一方案呢?真的能在五分鐘內集成嗎?真的能,不信您數着。
先介紹一個開源項目 MinioEx 是本人寫的一個對 Minio 的一個很是簡單的擴展。
https://github.com/zl33842901/MinioEx
下面咱們就跟着項目的 ReadMe 文檔,在五分鐘內把圖片服務器集成到項目裏吧。計時開始!
第一步,下載鏡像、下載工具。
假設如今您有一臺 IP 爲 172.16.250.147 的 Linux 服務器,已經安裝了 docker。那麼須要在上面把 Minio 和 ImageProxy 安裝起來。若是您不想使用圖片縮略功能,那麼 ImageProxy 不是必須的。html
docker run -d --name minio -p 9100:9000 -v /data/miniodata:/data -e "MINIO_ROOT_USER=admin" -e "MINIO_ROOT_PASSWORD=admin_123.abc" minio/minio server /data docker run -d --name imageproxy -p 8180:8080 -e "AWS_ACCESS_KEY_ID=admin" -e "AWS_SECRET_KEY=admin_123.abc" willnorris/imageproxy -baseURL http://172.16.250.147:9100/ -addr 0.0.0.0:8080 -cache "s3://us-east-1/thumbs/images?endpoint=172.16.250.147:9100&disableSSL=1&s3ForcePathStyle=1"
執行上面兩條命令後,服務器已經開始下載 Minio 和 ImageProxy 的鏡像,下載後會自動跑起來,咱們同時在本地下載一下 Minio 的管理工具 mc.exe。地址:https://dl.min.io/client/mc/release/windows-amd64/mc.exe 若是想下載 linux 或 mac 的,看這裏
第一步耗時一分鐘。前端
第二步,準備命令行。
mc.exe 是管理遠程 Minio 的工具,有些命令咱們須要準備一下,等步驟一的命令和下載完成後,咱們執行。在 mc.exe 的保存目錄,咱們建一個 connect.bat 並輸入 mc config host add minio147 http://172.16.250.147:9100 admin admin_123.abc
解釋一下: 這個命令能夠認爲是鏈接到遠程 Minio 服務器的命令, minio147 是本身命令的別名,以後就用這個名字管理遠程的 Minio,能夠本身隨便起名。admin 是 docker 命令裏指定的超管用戶名,admin_123.abc 是 docker 命令裏指定的超管密碼,建議換一下哈,個人這個太簡單。而後把個人開源項目根目錄裏的 newbucket.bat 下載下來,也放到 mc.exe 的保存路徑。若是你命名的別名不是「minio147」,你須要編輯一下這個 bat 文件,把第一行的 minio147 換成你命名的別名。
這個bat 文件的功能有:
a,建立存儲桶
b,設置存儲桶的匿名權限爲只讀
c,新增管理員 YourBucketName_admin ,密碼爲 YourBucketName_123.abc
d,新增管理策略 YourBucketName_admin_policy,此策略對建立的存儲桶具備讀寫權限
e,將管理策略 YourBucketName_admin_policy 應用到管理員 YourBucketName_admin。
第二步耗時一分鐘。linux
第三步,執行命令。
這時,第一步的下載鏡像、下載工具應該完成了,網慢不要怪我哈,等等就行了。打開命令提示符,目錄切到 mc.exe 保存的目錄,先執行 connect.bat 鏈接上 Minio 服務器。而後咱們須要新建一個存儲桶,先想一個桶名,能夠爲這個桶指定一個專有的管理員來上傳文檔。能夠叫 oa 或 crm 等。好比我在這裏用 crm 這個名稱。而後執行 「newbucket crm」 這個 bat 會幫咱們建桶、把桶設爲匿名可讀、建立 crm_admin 用戶(密碼是 crm_123.abc)、建立 crm 的讀寫權限並賦給 crm_admin。btw 密碼能夠在 http://172.16.250.147:9100 修改。
第三步耗時一分鐘。git
第四步,集成程序包。
若是您的項目是 AspNetCore 項目,那麼這麼作:
經過 Nuget 引用 xLiAd.MinioEx.AspNetCore 包。在 Startup 類的 ConfigureServices 方法里加入如下代碼:github
services.AddMinioEx((sp, options) => { var conf = sp.GetService<IConfiguration>(); options.MinioUrl = conf.GetSection("MinioUrl").Value; options.BucketName = conf.GetSection("BucketName").Value; options.AccessKey = conf.GetSection("AccessKey").Value; options.SecretKey = conf.GetSection("SecretKey").Value; options.ImageProxyUrl = conf.GetSection("ImageProxyUrl").Value; options.DirectoryPolicy = DirectoryPolicy.ByMonth; });
並在配置文件中加入如下代碼:docker
{ "MinioUrl": "172.16.250.147:9100", "BucketName": "crm", "AccessKey": "crm_admin", "SecretKey": "crm_123.abc", "ImageProxyUrl": "http://172.16.250.147:8180" /*ImageProxy 地址*/ }
若是您的項目不是 AspNetCore 而是通常的 dotnet 程序,您須要本身實例化對象:windows
var client = new MinioEx("172.16.250.147:9100", "crm", "crm_admin", "crm_123.abc", "http://172.16.250.147:8180", DirectoryPolicy.None);
第四步耗時一分鐘。數組
第五步,寫代碼。
在你接收文件的Controller 裏,注入 IMinioEx 實例(不是 AspNetCore 的本身實例化一下),在Action裏,好比個人 Action 叫 Upload, 寫以下代碼:服務器
public async Task<IActionResult> Upload() { var file = Request.Form.Files.FirstOrDefault(); if (file != null) { using var stream = file.OpenReadStream(); var result = await minioEx.UploadAsync(stream, System.IO.Path.GetExtension(file.FileName), file.ContentType); //生成個縮略圖連接 if(result.Length > 1) { var thumb = result[1].Insert(result[1].IndexOf('/', 9) + 1, "200x300"); result = result.ToList().Union(new string[] { thumb }).ToArray(); } return Json(new { suc = true, path = result }); } else return Json(new { suc = false, msg = "沒有上傳數據" }); }
UploadAsync 返回值是上傳後的路徑,若是是圖片,還會返回 ImageProxy 代理的路徑。返回類型是字符串數組,第一個元素固定是 minio 中的地址,若是存在第二個元素,則是 ImageProxy 的文件路徑(須要是圖片),在路徑中增長 option 信息能夠對圖片進行縮略。
第五步,耗時一分鐘,好了,集成完成。
能夠參照開源項目裏的 xLiAd.MinioEx.AspNetCore.Sample 這個項目,思路是同樣的。 前端使用了個人另外一個開源項目 zupload.js 。
怎麼樣,很簡單吧?快來試試吧。async