.NET壓縮圖片保存

来源:https://www.cnblogs.com/Mrly/archive/2019/01/04/10219088.html
-Advertisement-
Play Games

需求: 需要將用戶後買的圖片批量下載打包壓縮,並且分不同的文件夾(因:購買了多個用戶的圖片情況) 文章中用到了一個第三方的類庫,Nuget下載 SharpZipLib 目前用的 1.1的版本 效果: 伺服器目錄展示: 裡面對應目錄層級的圖片 前端提交POST請求案例: function DownAl ...


需求:

需要將用戶後買的圖片批量下載打包壓縮,並且分不同的文件夾(因:購買了多個用戶的圖片情況)

文章中用到了一個第三方的類庫,Nuget下載 SharpZipLib 目前用的 1.1的版本

 

效果:

 

伺服器目錄展示:

裡面對應目錄層級的圖片

 

前端提交POST請求案例:

function DownAllFile(filename, imgUrl, down) {

var urlStr = "";
//url字元串 (示例數據) (註意!: 使用 '逗號' 分隔文件名和 url 地址,使用 '$' 分隔 每個文件.)
if (filename != '' && imgUrl != '')
urlStr = filename + "," + imgUrl;

//form提交
var form = $('<form>');
form.attr('style', 'display:none');
form.attr('target', '');
form.attr('method', 'post');
form.attr('action', '/PayStripe.ashx?method=DownLoadImage'); //這裡寫對應的方法地址

var name1 = $('<input>');
name1.attr('type', 'text');
name1.attr('name', 'urlStr');
name1.attr('value', urlStr); //文件url

if (down == "P") {
var vals = "";
$.each($('input:checkbox:checked'), function () {
vals += $(this).val() + ",";
});
var checkbox1 = $('<input>');
checkbox1.attr('type', 'text');
checkbox1.attr('name', 'coid');
checkbox1.attr('value', vals); //文件url
form.append(checkbox1);
}
$('body').append(form);
form.append(name1);
form.submit();
form.remove();
}

 

後端實現代碼:

//得到文件信息(名字,地址) (去掉最後一個 '$' , 並用 '$' 分隔字元串. 取到每個文件的文件名和路徑 )
string[] urlArray = model.urlStr.TrimEnd('$').Split('$');

//存 文件名 和 數據流
Dictionary<string, Stream> dc = new Dictionary<string, Stream>();

//取出字元串中信息 (文件名和地址)
for (int i = 0; i < urlArray.Length; i++)
{
WebClient myWebClient = new WebClient();
//使用 ',' 分隔 文件名和路徑 [0]位置是文件名, [1] 位置是路徑
string[] urlSp = urlArray[i].Split(',');
//調用WebClient 的 DownLoadData 方法 下載文件
byte[] data = myWebClient.DownloadData(urlSp[1].Replace("_PB.jpg", "_B.jpg"));
Stream stream = new MemoryStream(data);//byte[] 轉換成 流

//放入 文件名 和 stream
dc.Add(urlSp[0] + ".jpg" + "," + urlSp[2], stream);//這裡指定為 .doc格式 (自己可以隨時改)

if (urlArray.Length == 1)
{
Image img = Image.FromStream(stream);
MemoryStream ms = new MemoryStream();
img.Save(ms, ImageFormat.Jpeg);
img.Dispose();
context.Response.ClearContent();
context.Response.ContentType = "application/octet-stream";
context.Response.AppendHeader("Content-Disposition", "attachment;filename=" + urlSp[0] + ".jpeg");//文件名和格式(格式可以自己定)
context.Response.ContentType = "image/jpeg";
context.Response.BinaryWrite(ms.ToArray());
return;
}
}

//調用壓縮方法 進行壓縮 (接收byte[] 數據)
byte[] fileBytes = ConvertZipStream(dc);

context.Response.ContentType = "application/octet-stream";
context.Response.AppendHeader("Content-Disposition", "attachment;filename=SoonnetImage.rar");//文件名和格式(格式可以自己定)
context.Response.AddHeader("Content-Length", fileBytes.Length.ToString());//文件大小
context.Response.BinaryWrite(fileBytes); //放入byte[]
context.Response.End();
context.Response.Close();

 

 

 

/// <summary>
/// ZipStream 壓縮
/// </summary>
/// <param name="streams">Dictionary(string, Stream) 文件名和Stream</param>
/// <returns></returns>
public static byte[] ConvertZipStream(Dictionary<string, Stream> streams)
{
byte[] buffer = new byte[6500];
MemoryStream returnStream = new MemoryStream();
var zipMs = new MemoryStream();
using (ICSharpCode.SharpZipLib.Zip.ZipOutputStream zipStream = new ICSharpCode.SharpZipLib.Zip.ZipOutputStream(zipMs))
{
zipStream.SetLevel(9);//設置 壓縮等級 (9級 500KB 壓縮成了96KB)
foreach (var kv in streams)
{
string[] fileName = kv.Key.Split(',');
using (var streamInput = kv.Value)
{
zipStream.PutNextEntry(new ICSharpCode.SharpZipLib.Zip.ZipEntry(fileName[1] + "/" + fileName[0]));  //主要是這裡可以分文件夾自動壓縮
while (true)
{
var readCount = streamInput.Read(buffer, 0, buffer.Length);
if (readCount > 0)
{
zipStream.Write(buffer, 0, readCount);
}
else
{
break;
}
}
zipStream.Flush();
}
}
zipStream.Finish();
zipMs.Position = 0;
zipMs.CopyTo(returnStream, 5600);
}
returnStream.Position = 0;

//Stream轉Byte[]
byte[] returnBytes = new byte[returnStream.Length];
returnStream.Read(returnBytes, 0, returnBytes.Length);
returnStream.Seek(0, SeekOrigin.Begin);

return returnBytes;
}

 

註:

文章中代碼有牽扯到 1 長圖片點擊直接下載的功能,可以刪除部分邏輯實現,不同文件夾壓縮圖片功能。

該壓縮並非會壓縮圖片本身,解壓後,圖片的大小跟實際大小一致。


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

-Advertisement-
Play Games
更多相關文章
  • 第1節. 關鍵字 馳騁工作流引擎 流程快速開發平臺 workflow ccflow jflow 第1節. 流程引擎表結構的設計 流程引擎表是流程引擎控制流程運轉的數據存儲表,是整個流程引擎的核心表。理解表結構,掌握狀態欄位,相關欄位變化的規律,就掌握的整個流程引擎運轉的規律了。 1.1.1: 流程引... ...
  • Console.Write();和Console.WriteLine();區別詳解: Console.Write();,專業:將指定的字元串值寫入標準輸出流。通俗:控制台輸出,不換行。 示例代碼: 1 using System; 2 using System.Collections.Generic; ...
  • 圖片上傳和展示是互聯網應用中比較常見的一個功能,最近做的一個門戶網站項目就有多個需要上傳圖片的功能模塊。關於這部分內容,本來功能不複雜,但後面做起來卻還是出現了一些波折。因為缺乏經驗,對幾種圖片上傳的方法以及使用範圍和優缺點都不太瞭解,導致在做相關功能時也確實走了一些彎路。 起初我用的是SaveAs ...
  • 收集的Emgucv的整理書籍資料和Emgucv動態調試器:下載地址 本文代碼下載:下載 ...
  • 1. 引用System.Speech 2. 通過SpeechSynthesizer類朗讀文本 new SpeechSynthesizer().SpeakAsync("我們都是好孩子We're good kids.") 3. Speck vs SpeckAsync函數 PlayAsync--異常播放, ...
  • 認識ASP.NET CoreASP.NET Core是一個跨平臺,高性能,開源的框架,用於構建現代,基於雲的網路應用程式,使用ASP.NET Core可以實現:開發web應用,服務,IoT應用和移動端的後臺api。可以使用自己擅長的開發工具實現跨平臺開發,包括Windows,macOS和Linux。... ...
  • 當我們從單體架構遷移到微服務模式時,其中一個比較大的變化就是模塊(業務,服務等)間的調用方式。在以前,一個業務流程的執行在一個進程中就完成了,但是在微服務模式下可能會分散到2到10個,甚至更多的機器(微服務)上,這必然就要使用網路進行通信。而網路本身就是不可靠的,並隨著每個服務都根據自身的情況進行的 ...
  • Dapper 鏈式查詢擴展 DapperSqlMaker Github地址:https://github.com/mumumutou/DapperSqlMaker 歡迎大佬加入 Demo: 查詢 TestsDapperSqlMaker\DapperSqlMaker.Test\ SelectDappe ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...