通過圖片流來返回圖片

来源:https://www.cnblogs.com/ZYPLJ/archive/2023/06/05/17457385.html
-Advertisement-
Play Games

# 通過圖片流來返回圖片 # 前言 之前寫了個圖片介面,然後做了個授權,但是光返回圖片地址雖然能適應大部分需求,但是考慮到有些人不想去處理返回值,也是做了個直接返回圖片流的介面。 # 介面展示 ## 返回指定寬度和高度圖片流 ![image](https://img2023.cnblogs.com/ ...


通過圖片流來返回圖片

前言

之前寫了個圖片介面,然後做了個授權,但是光返回圖片地址雖然能適應大部分需求,但是考慮到有些人不想去處理返回值,也是做了個直接返回圖片流的介面。

介面展示

返回指定寬度和高度圖片流

image

直接返回原圖

image

介面實現

Service層

如何返回圖片流給前端呢,首先寫個Service層,創建GetOriginalDrawingAsync方法:

imagePath為圖片存儲的路徑,代碼太多了,這裡就不做多的解釋了,至於圖片路徑怎麼傳都行,只要是能訪問到的路徑就行。

    public async Task<(Image, IImageFormat)> GetOriginalDrawingAsync(string imagePath)
    {
        await using var fileStream = new FileStream(imagePath, FileMode.Open);
        var (image, format) = await Image.LoadWithFormatAsync(fileStream);
        return (image, format);
    }

上述方法使用了SixLabors.ImageSharp庫,可通過NuGet包下載

首先這個方法的返回值是(Image, IImageFormat)

Image 表示一個圖像對象,包含了圖像的像素數據和相關的元數據信息。IImageFormat 表示圖像的格式,例如 JPEG、PNG 等。這兩個對象一起組成了這個方法的返回值,表示從指定路徑的圖像文件中讀取到的原始圖像及其格式。

Controller層

然後在控制器層編寫一個私有方法去處理Service返回的圖片信息

    private static async Task<IActionResult> GenerateImageResponse(Image image, IImageFormat format)
    {
        var encoder = image.GetConfiguration().ImageFormatsManager.FindEncoder(format);
        await using var stream = new MemoryStream();
        await image.SaveAsync(stream, encoder);
        return new FileContentResult(stream.GetBuffer(), "image/jpeg");
    }

代碼詳解如下:

  1. 首先調用 GetConfiguration 方法獲取當前 Image 對象的配置信息。
  2. 調用 ImageFormatsManager.FindEncoder 方法,根據指定的圖像格式獲取相應的編碼器。
  3. 創建一個 MemoryStream 對象,並使用 await 等待對象創建完成。
  4. 調用 image.SaveAsync 方法,將當前 Image 對象保存到記憶體流中,並使用指定的編碼器進行編碼。
  5. 創建一個 FileContentResult 對象,將記憶體流中的圖像數據作為文件內容,並將文件類型設置為 image/jpeg
  6. FileContentResult 對象作為 IActionResult 對象返回給調用方。

編寫介面

[HttpGet]
public async Task<IActionResult> GetImageStreamOd()
{
    var (image, format) = await _getImageService.GetOriginalDrawingFormatAsync();
    return await GenerateImageResponse(image, format);
}

Ok,一個返回圖片流的介面就完成了。

說明

這樣子請求就很方便了,不過介面使用了授權,需要在請求的時候帶上token欄位,如何繼續採用之前的方法帶上token還是要進行處理,不過我在後臺設置了一下,只要Get請求參數中有token即可。

返回指定格式圖片:

http://zy.pljzy.top/Api/Image/GetImageStream?token=這裡填寫token&width=500&height=500

返回原圖:

http://zy.pljzy.top/Api/Image/GetImageStreamOd?token=這裡填寫token

然後直接就能在網站上使用了

<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title></title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
    </head>
    <body>
        <img src="http://zy.pljzy.top/Api/Image/GetImageStreamOd?token=這裡是token" alt=""/>
    </body>
</html>

image

token和其他的請求方式在上一篇文章已經說過了,只需要通過公眾號獲取token即可訪問介面,關註公眾號回覆“獲取token”就行
ZY知識庫 · ZY - 圖片介面JWT鑒權實現 (pljzy.top)

image

聲明

本項目學習於StarBlog · 畫星星高手 - Home Page (deali.cn)中圖片介面而來,我的ZY知識庫也是基於該博客學習而來,這個博主嘎嘎流弊。博客是開源的,對於.NET感興趣的可以去瞭解一下。

然後這個圖片項目也是更新了3篇文章,如果後面沒什麼特別的需求是不會更新了,這個小項目也就到此結束。

我的博客地址:

ZY知識庫 · ZY - Home Page (pljzy.top)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 基於java的倉庫管理系統設計與實現,可適用於出庫、入庫、庫存管理,基於java的出入庫管理,java出入庫管理系統,基於java的WMS倉庫管理系統,庫存物品管理系統。 ...
  • # 1、背景 在我們開發的過程中有這麼一種場景, `/projectA` 目錄是 `hadoopdeploy`用戶創建的,他對這個目錄有`wrx`許可權,同時這個目錄屬於`supergroup`,在這個組中的用戶也具有這個目錄的`wrx`許可權,對於其他人,不可訪問這個目錄。現在有這麼一個特殊的用戶`r ...
  • 有時候,我們為了方便,我們往往使用擴展函數的代碼方式創建很多GridView的操作功能,如在隨筆《在DevExpress中使用BandedGridView表格實現多行表頭的處理》中介紹過多行表頭的創建及綁定處理,在《基於DevExpress的GridControl實現的一些界面處理功能》也介紹了一些... ...
  • ## 一:背景 ### 1. 講故事 在這麼多的案例分析中,往往會發現一些案例是卡死線上程的內核態棧上,但拿過來的dump都是用戶態模式下,所以無法看到內核態棧,這就比較麻煩,需要讓朋友通過其他方式生成一個藍屏的dump,這裡我們簡單彙總下。 ## 二:如何生成內核態dump ### 1. 案例代碼 ...
  • # 使用c#實現23種常見的設計模式 設計模式通常分為三個主要類別: - 創建型模式 - 結構型模式 - 行為型模式。 這些模式是用於解決常見的對象導向設計問題的最佳實踐。 以下是23種常見的設計模式並且提供`c#代碼案例`: ## 創建型模式: ### 1. 單例模式(Singleton) ``` ...
  • SM2是國家密碼管理局於2010年12月17日發佈的橢圓曲線公鑰密碼演算法。 產生背景: 隨著密碼技術和電腦技術的發展,目前常用的1024位RSA演算法面臨嚴重的安全威脅,我們國家密碼管理部門經過研究,決定採用SM2橢圓曲線演算法替換RSA演算法。 SM2演算法和RSA演算法都是公鑰密碼演算法,SM2演算法是一種 ...
  • 導航屬性 導航屬性是作為.NET ORM核心功能中的核心,在SqlSugar沒有支持導航屬性前,都說只是一個高級DbHelper, 經過3年的SqlSugar重構已經擁有了一套 非常成熟的導航屬性體系,本文不是重點講SqlSugar而是重點講導航屬性的作用,讓更多寫Sql人還未使用ORM的人瞭解到O ...
  • System.Speech是.NET框架的一部分,提供了語音識別和語音合成的功能。通過使用System.Speech命名空間中的類,開發人員可以在.NET應用程式中實現語音識別功能。 在本文中,我將演示如何使用 System.Speech.NET,這是開發語音應用程式比較牛逼的內庫。它適用於 .NE ...
一周排行
    -Advertisement-
    Play Games
  • 一、openKylin簡介 openKylin(開放麒麟) 社區是在開源、自願、平等和協作的基礎上,由基礎軟硬體企業、非營利性組織、社團組織、高等院校、科研機構和個人開發者共同創立的一個開源社區,致力於通過開源、開放的社區合作,構建桌面操作系統開源社區,推動Linux開源技術及其軟硬體生態繁榮發展。 ...
  • 簡介 Flurl是一個用於構建基於HTTP請求的C#代碼的庫。它的主要目的是簡化和優雅地處理網路請求(只用很少的代碼完成請求)。Flurl提供了一種簡單的方法來構建GET、POST、PUT等類型的請求,以及處理響應和異常。它還提供了一些高級功能,如鏈式調用、緩存請求結果、自動重定向等。本文將介紹Fl ...
  • 一:背景 1. 講故事 最近也挺奇怪,看到了兩起 CPU 爆高的案例,且誘因也是一致的,覺得有一些代表性,合併分享出來幫助大家來避坑吧,閑話不多說,直接上 windbg 分析。 二:WinDbg 分析 1. CPU 真的爆高嗎 這裡要提醒一下,別人說爆高不一定真的就是爆高,我們一定要拿數據說話,可以 ...
  • 剛開始寫文章,封裝Base基類的時候,添加了trycatch異常塊,不過當時沒有去記錄日誌,直接return了。有小伙伴勸我不要吃了Exception 其實沒有啦,項目剛開始,我覺得先做好整體結構比較好。像是蓋樓一樣。先把樓體建造出來,然後再一步一步的美化完善。 基礎的倉儲模式已經ok,Autofa ...
  • 框架目標 什麼是框架,框架能做到什麼? 把一個方向的技術研發做封裝,具備通用性,讓使用框架的開發者用起來很輕鬆。 屬性: 通用性 健壯性 穩定性 擴展性 高性能 組件化 跨平臺 從零開始-搭建框架 建立項目 主鍵查詢功能開發 綁定實體 一步一步的給大家推導: 一邊寫一邊測試 從零開始--搭建框架 1 ...
  • 大家好,我是沙漠盡頭的狼。 本方首發於Dotnet9,介紹使用dnSpy調試第三方.NET庫源碼,行文目錄: 安裝dnSpy 編寫示常式序 調試示常式序 調試.NET庫原生方法 總結 1. 安裝dnSpy dnSpy是一款功能強大的.NET程式反編譯工具,可以對.NET程式進行反編譯,代替庫文檔的功 ...
  • 在`Windows`操作系統中,每個進程的虛擬地址空間都被劃分為若幹記憶體塊,每個記憶體塊都具有一些屬性,如記憶體大小、保護模式、類型等。這些屬性可以通過`VirtualQueryEx`函數查詢得到。該函數可用於查詢進程虛擬地址空間中的記憶體信息的函數。它的作用類似於`Windows`操作系統中的`Task... ...
  • 背景介紹 1,最近有一個大數據量插入的操作入庫的業務場景,需要先做一些其他修改操作,然後在執行插入操作,由於插入數據可能會很多,用到多線程去拆分數據並行處理來提高響應時間,如果有一個線程執行失敗,則全部回滾。 2,在spring中可以使用@Transactional註解去控制事務,使出現異常時會進行 ...
  • 線程(thread)是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際 運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以併發多個線程,每條線 程並行執行不同的任務。 ...
  • 發現Java 21的StringBuilder和StringBuffer中多了repeat方法: /** * @throws IllegalArgumentException {@inheritDoc} * * @since 21 */ @Override public StringBuilder ...