基于.NetCore開發博客項目 StarBlog - (25) 圖片接口與文件上傳

1前言

上傳文件的接口設計有兩種風格,一種是整個項目只設置一個接口用來上傳,然后其他需要用到文件的地方,都只存一個引用ID;另一種是每個需要文件的地方單獨管理各自的文件。這倆各有優劣吧,本項目中選擇的是后者的風格,文章圖片和照片模塊又要能CRUD又要批量導入,還是各自管理文件比較好。

2圖片接口

說會正題,先介紹一下圖片相關接口。

圖片列表

首先CRUD是肯定有的,圖片列表的分頁查看也是有的,不過因為篩選功能沒有做,所以就不定義一個ViewModel作為參數了。

控制器代碼 StarBlog.Web/Apis/Blog/PhotoController.cs

[HttpGet]
public?ApiResponsePaged<Photo>?GetList(int?page?=?1,?int?pageSize?=?10)?{var?paged?=?_photoService.GetPagedList(page,?pageSize);return?new?ApiResponsePaged<Photo>?{Pagination?=?paged.ToPaginationMetadata(),Data?=?paged.ToList()};
}

跟博客前臺公用一套圖片列表邏輯,所以這部分抽出來放在service,代碼如下

StarBlog.Web/Services/PhotoService.cs

public?IPagedList<Photo>?GetPagedList(int?page?=?1,?int?pageSize?=?10)?{return?_photoRepo.Select.OrderByDescending(a?=>?a.CreateTime).ToList().ToPagedList(page,?pageSize);
}

單個圖片

獲取單個圖片,跟獲取文章的差不多,傳入ID,找不到就返回404,找到就返回圖片對象

[HttpGet("{id}")]
public?ApiResponse<Photo>?Get(string?id)?{var?photo?=?_photoService.GetById(id);return?photo?==?null??ApiResponse.NotFound($"圖片?{id}?不存在"):?new?ApiResponse<Photo>?{Data?=?photo};
}

圖片縮略圖

在本系列第20篇中,本項目已經實現了圖片顯示的優化,詳見:基于.NetCore開發博客項目 StarBlog - (20) 圖片顯示優化

除了 ImageSharp 組件提供的圖片縮略圖功能外,我這里還寫了另一個生成縮略圖的方法,這個方法有倆特點

  • 直接在內存中生成返回,不會寫入緩存文件

  • 生成的是Progressive JPEG格式,目前 ImageSharp 是不支持的,可以優化前端的加載速度

控制器代碼

[HttpGet("{id}/Thumb")]
public?async?Task<IActionResult>?GetThumb(string?id,?[FromQuery]?int?width?=?300)?{var?data?=?await?_photoService.GetThumb(id,?width);return?new?FileContentResult(data,?"image/jpeg");
}

service代碼

///?<summary>
///?生成Progressive?JPEG縮略圖?(使用?MagickImage)
///?</summary>
///?<param?name="width">設置為0則不調整大小</param>
public?async?Task<byte[]>?GetThumb(string?id,?int?width?=?0)?{var?photo?=?await?_photoRepo.Where(a?=>?a.Id?==?id).FirstAsync();using?(var?image?=?new?MagickImage(GetPhotoFilePath(photo)))?{image.Format?=?MagickFormat.Pjpeg;if?(width?!=?0)?{image.Resize(width,?0);}return?image.ToByteArray();}
}

這個 MagickImage 是用 C++ 寫的,在不同平臺上引用不同 native 庫,需要在 csproj 里面寫上配置,這樣發布的時候才會帶上對應的依賴庫,而且似乎在 CentOS 系統上會有坑…

<!--??復制?Magick?庫??-->
<PropertyGroup><MagickCopyNativeWindows>true</MagickCopyNativeWindows><MagickCopyNativeLinux>true</MagickCopyNativeLinux><MagickCopyNativeMacOS>true</MagickCopyNativeMacOS>
</PropertyGroup>

其他接口

還有一些接口,跟之前介紹的大同小異,再重復一次也意義不大,讀者有需要的話可以自行查看源碼。

  • 刪除圖片

  • 設置和取消推薦

  • 重建圖片庫數據(更新每個圖片的尺寸等數據,一般情況下不需要用到)

  • 批量導入(本系列的第9篇已經介紹過)詳見:基于.NetCore開發博客項目 StarBlog - (9) 圖片批量導入

3圖片文件上傳

這個同時也是圖片的添加接口

先定義DTO

public?class?PhotoCreationDto?{///?<summary>///?作品標題///?</summary>[Required(ErrorMessage?=?"作品標題不能為空")]public?string?Title?{?get;?set;?}///?<summary>///?拍攝地點///?</summary>[Required(ErrorMessage?=?"拍攝地點不能為空")]public?string?Location?{?get;?set;?}
}

控制器代碼

[Authorize]
[HttpPost]
public?ApiResponse<Photo>?Add([FromForm]?PhotoCreationDto?dto,?IFormFile?file)?{var?photo?=?_photoService.Add(dto,?file);return?!ModelState.IsValid??ApiResponse.BadRequest(ModelState):?new?ApiResponse<Photo>(photo);
}

因為上傳的同時還要附帶一些數據,需要使用 FormData 傳參,所以這里使用 [FromForm] 特性標記這個 dto 參數

IFormFile 類型的參數可以拿到上傳上來的文件

下面是service代碼

public?Photo?Add(PhotoCreationDto?dto,?IFormFile?photoFile)?{var?photoId?=?GuidUtils.GuidTo16String();var?photo?=?new?Photo?{Id?=?photoId,Title?=?dto.Title,CreateTime?=?DateTime.Now,Location?=?dto.Location,FilePath?=?Path.Combine("photography",?$"{photoId}.jpg")};var?savePath?=?Path.Combine(_environment.WebRootPath,?"media",?photo.FilePath);//?如果超出最大允許的大小,則按比例縮小const?int?maxWidth?=?2000;const?int?maxHeight?=?2000;using?(var?image?=?Image.Load(photoFile.OpenReadStream()))?{if?(image.Width?>?maxWidth)image.Mutate(a?=>?a.Resize(maxWidth,?0));if?(image.Height?>?maxHeight)image.Mutate(a?=>?a.Resize(0,?maxHeight));image.Save(savePath);}//?保存文件using?(var?fs?=?new?FileStream(savePath,?FileMode.Create))?{photoFile.CopyTo(fs);}//?讀取圖片的尺寸等數據photo?=?BuildPhotoData(photo);return?_photoRepo.Insert(photo);
}

這里對圖片做了一些處理,拋開這些細節,其實對上傳的文件,最關鍵的只有幾行保存代碼

using?(var?fs?=?new?FileStream("savePath",?FileMode.Create))?{photoFile.CopyTo(fs);
}

這樣就完成了文件上傳接口。

4系列文章

  • 基于.NetCore開發博客項目 StarBlog - (1) 為什么需要自己寫一個博客?

  • 基于.NetCore開發博客項目 StarBlog - (2) 環境準備和創建項目

  • 基于.NetCore開發博客項目 StarBlog - (3) 模型設計

  • 基于.NetCore開發博客項目 StarBlog - (4) markdown博客批量導入

  • 基于.NetCore開發博客項目 StarBlog - (5) 開始搭建Web項目

  • 基于.NetCore開發博客項目 StarBlog - (6) 頁面開發之博客文章列表

  • 基于.NetCore開發博客項目 StarBlog - (7) 頁面開發之文章詳情頁面

  • 基于.NetCore開發博客項目 StarBlog - (8) 分類層級結構展示

  • 基于.NetCore開發博客項目 StarBlog - (9) 圖片批量導入

  • 基于.NetCore開發博客項目 StarBlog - (10) 圖片瀑布流

  • 基于.NetCore開發博客項目 StarBlog - (11) 實現訪問統計

  • 基于.NetCore開發博客項目 StarBlog - (12) Razor頁面動態編譯

  • 基于.NetCore開發博客項目 StarBlog - (13) 加入友情鏈接功能

  • 基于.NetCore開發博客項目 StarBlog - (14) 實現主題切換功能

  • 基于.NetCore開發博客項目 StarBlog - (15) 生成隨機尺寸圖片

  • 基于.NetCore開發博客項目 StarBlog - (16) 一些新功能 (監控/統計/配置/初始化)

  • 基于.NetCore開發博客項目 StarBlog - (17) 自動下載文章里的外部圖片

  • 基于.NetCore開發博客項目 StarBlog - (18) 實現本地Typora文章打包上傳

  • 基于.NetCore開發博客項目 StarBlog - (19) Markdown渲染方案探索

  • 基于.NetCore開發博客項目 StarBlog - (20) 圖片顯示優化

  • 基于.NetCore開發博客項目 StarBlog - (21) 開始開發RESTFul接口

  • 基于.NetCore開發博客項目 StarBlog - (22) 開發博客文章相關接口

  • 基于.NetCore開發博客項目 StarBlog - (23) 文章列表接口分頁、過濾、搜索、排序

  • 基于.NetCore開發博客項目 StarBlog - (24) 統一接口數據返回格式

  • 基于.NetCore開發博客項目 StarBlog - (25) 圖片接口與文件上傳

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/279977.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279977.shtml
英文地址,請注明出處:http://en.pswp.cn/news/279977.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pta7-7旅游規劃(dijkstra算法)

題目鏈接&#xff1a;https://pintia.cn/problem-sets/1101307589335527424/problems/1101314114762387456 題意&#xff1a;給n給城市&#xff0c;m條公路&#xff0c;公路是雙向的&#xff0c;起點S&#xff0c;終點D&#xff0c;并給出每條公路連接的兩個city的編號以及路費…

context:annotation-config vs context:component-scan

<context:annotation-config> 用來注入已經在上下文注冊的bean&#xff0c;無論bean是定義在XML中還是被 package scanning。 <context:component-scan>僅scans packages 去注冊應用上線文中的Bean。 example&#xff1a; Lets start with a basic setup of three …

Cactiz中文版安裝使用

#----------------------------------------------------------# # > 紅色字體 -特指煮酒個人所見。加粗則為需要重點注意。 ## > 藍色加粗 -特指與本文相關人員&#xff0c;包括參與修正的朋友。 ## > 煮酒品茶 -Http://cwtea.blog.51cto.com # #----------…

如何在OS X中打開或關閉鼠標定位器

OS X 10.11 El Capitan includes a new “mouse locator” feature. If you lose your mouse pointer, just shake the mouse or move your finger on the touch pad vigorously, and the mouse pointer will temporarily grow very large so you can see it. OS X 10.11 El Ca…

微軟宣布 Win10 設備數突破8億,距離10億還遠嗎?

百度智能云 云生態狂歡季 熱門云產品1折起>>> 微軟高管 Yusuf Mehdi 昨天在推特發布了一條推文&#xff0c;宣布運行 Windows 10 的設備數已突破 8 億&#xff0c;比半年前增加了 1 億。 根據之前的報道&#xff0c;兩個月前 Windows 10 的全球市場份額才首次超越 W…

UI自動化web端框架path.py代碼

import os,sysBASE_PATH os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))sys.path.insert(0, BASE_PATH)# 配置文件CONF_PATH BASE_PATH os.path.sep conf os.path.sep config.json# 日志的路徑WEB_LOG_PATH BASE_PATH os.path.sep lo…

snapchat為什么_我的Snapchat朋友旁邊的表情符號是什么意思?

snapchat為什么Next to some of your Snapchat friends, you’ll see little emoji. 在您的某些Snapchat朋友旁邊&#xff0c;您會看到小的表情符號。 Each of these emoji has a specific meaning. Let’s look at what they are. 這些表情符號都有特定的含義。 讓我們看看它們…

暴力打表之hdu 2089

題目鏈接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2089 有兩種方法&#xff1a; 1.數位DP算法 2.暴力打表——真是個好法子&#xff01;&#xff01;&#xff01; 接下來是注意點&#xff1a; 1.一般這種數組中的一個數減去一個數組的另一個數&#xff0c;sum[i…

最全的正則表達式大全

很多不太懂正則的朋友&#xff0c;在遇到需要用正則校驗數據時&#xff0c;往往是在網上去找很久&#xff0c;結果找來的還是不很符合要求。所以我最近把開發中常用的一些正則表達式整理了一下&#xff0c;在這里分享一下。給自己留個底&#xff0c;也給朋友們做個參考。 一、校…

關于移動應用APP數據安全的一點見解

2019獨角獸企業重金招聘Python工程師標準>>> 項目溝通中過程客戶反復在強調&#xff0c;大數據的安全性&#xff0c; 言下之意&#xff0c;用了大數據&#xff0c;就不安全了&#xff0c;就有漏洞了。所以花了些時間&#xff0c;針對大數據的安全設計做了一個總結&a…

2022年底C# 解壓zip文件遇到的一個Bug

本文由網友投稿。作者&#xff1a;江湖人士原文標題&#xff1a;2022年底C# 解壓zip文件遇到的一個bug原文鏈接&#xff1a;https://jhrs.com/2022/46060.html最近在排查一個上傳功能時&#xff0c;客戶端上傳的是zip文件&#xff0c;到服務器端后使用C# 解壓zip文件的代碼將上…

如何關閉mcafee軟件_如何擺脫McAfee的通知和捆綁軟件

如何關閉mcafee軟件McAfee, like most other modern antivirus programs, doesn’t stay out of your way. It installs browser extensions and shows various alert messages you might not want to see. If McAfee came with your PC, you may regularly see messages that …

mfs使用指引

客戶端工具集 mfsgetgoal #設定副本數mfssetgoal #獲取副本數mfscopygoal # mfsgetsclass mfssetsclass mfscopysclass mfsxchgsclass mfslistsclass mfsgettrashtime #設定回收站時間 mfssettrashtime #設定回收站時間 mfscopytrashtime mfsgeteattr #設置權限 mfsseteattr…

【命名規范】.NET中的枚舉類型,要以Enum結尾嗎?

“首先要給它一個名字&#xff0c;然后你才能描述它。”圖片&#xff1a;北京的晚霞 攝影師&#xff1a;劉先生這個話題源于公司《.NET技術規范》中的一條&#xff1a;【強制】枚舉聲明應以Enum結尾我對此并不認同&#xff1a;首先&#xff0c;引用一下微軟官方文檔中&#xff…

Linux中防火墻(一)

一&#xff1a;前言防火墻&#xff0c;其實說白了講&#xff0c;就是用于實現Linux下訪問控制的功能&#xff0c;它分為硬件的或者軟件的防火墻兩種。無論是在哪個網絡中&#xff0c;防火墻工作的地方一定是在網絡的邊緣。而我們的任務就是需要去定義到底防火墻如何工作&#x…

macos安全性偏好設置_如何更改macOS系統偏好設置的布局

macos安全性偏好設置If you don’t care for the way the System Preferences appear in macOS, you can change them by hiding certain preference panels or by rearranging them alphabetically. 如果您不喜歡系統偏好設置在macOS中的顯示方式&#xff0c;則可以通過隱藏某…

機器視覺技術在表面缺陷檢測方面的發展趨勢

導讀&#xff1a;機器視覺技術在表面缺陷檢測方面的發展趨勢如何&#xff1f;很多人都不了解&#xff0c;據悉&#xff0c;目前工業中應用的機器視覺檢測絕大部分執行的是二維檢測任務&#xff0c;三維機器視覺檢測仍處于理論研究和試驗階段。除此之外&#xff0c;機器視覺檢測…

J.U.C之AQS

AQS是J.U.C的核心 AQS(AbstractQueuedSynchronizer)隊列同步器&#xff0c;AQS是JDK下提供的一套用于實現基于FIFO等待隊列的阻塞鎖和相關的同步器的一個同步框架。 同步器面向的是鎖的實現者&#xff0c;它簡化了鎖的實現方式&#xff0c;屏蔽了同步狀態管理、線程的排隊、等待…

.NET周報【12月第3期 2022-12-23】

由于眾所周知的原因&#xff0c;大佬們紛紛加入羊群&#xff0c;筆者也未能幸免&#xff0c;體驗下來這絕對不是普通感冒的癥狀&#xff0c;身體不適&#xff0c;熬了幾天&#xff0c;所以本周更新比較晚&#xff1b;另外精力有限&#xff0c;對于國際板塊只有鏈接沒有簡介&…

亞馬遜的vps多少錢一個月_如何查看您在亞馬遜上花了多少錢

亞馬遜的vps多少錢一個月Have you ever wondered how much you’ve spent at Amazon during your lifetime? Whether you’re feeling curious or just plain brave, there’s an easy way to find out. 您是否想過一生在亞馬遜上花了多少錢&#xff1f; 無論您是好奇還是勇敢…