c#和pdf.js實現分片預覽pdf

源碼如下:

/// <summary>/// 文件處理/// </summary>[RoutePrefix("api/fs")]public class FileStoreController : ApiController{/// <summary>/// 文件預覽/// </summary>/// <param name="filepath">文件路徑</param>/// <returns></returns>[Description("文件預覽")][HttpGet, Route("preview")]public  HttpResponseMessage Preview([Description("文件路徑")] string filepath){try{FileInfo fileInfo = new FileInfo(filepath);long fileSize = fileInfo.Length;var response = Request.CreateResponse();StreamContent content = null;// 下載的字節范圍long startByte = 0, endByte = fileSize - 1, totalByte = fileSize;if (Request.Headers.TryGetValues("range", out IEnumerable<string> rangeHeader)){// 斷點續傳var rangeString = rangeHeader.FirstOrDefault();var match = Regex.Match(rangeString, @"bytes=(\d+)-(\d+)");// 文件總大小totalByte = fileSize;startByte = long.Parse(match.Groups[1].Value);endByte = long.Parse(match.Groups[2].Value);// 返回http狀態response.StatusCode = HttpStatusCode.PartialContent;long bytesToRead = endByte - startByte + 1;var contentStream = ReadFileInRange(filepath, startByte, endByte);content = new StreamContent(contentStream);content.Headers.ContentLength = Convert.ToInt32(endByte - startByte + 1);}else{// 文件總大小totalByte = fileSize;// 下載起始位置startByte = 0;// 下載結束位置endByte = totalByte - 1;response.StatusCode = HttpStatusCode.OK;using (var ms = new MemoryStream()){content = new StreamContent(ms);}}//表明服務器支持分片加載response.Headers.AcceptRanges.Add("bytes");//Content - Range: bytes 0 - 65535 / 408244,表明此次返回的文件范圍content.Headers.ContentRange = new ContentRangeHeaderValue(startByte, endByte, totalByte);告知瀏覽器這是一個字節流,瀏覽器處理字節流的默認方式就是下載content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");response.Content = content;//需要設置此屬性,否則瀏覽器默認不會讀取到響應頭中的Accept-Ranges屬性,因此會認為服務器端不支持分片,所以會直接全文下載response.Headers.Add("Access-Control-Expose-Headers", "*");response.Headers.Add("Access-Control-Allow-Headers", "range,Accept-Ranges,Content-Range,Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN,Cache-Control,If-Modified-Since");return response;}catch (Exception ex){return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "服務器內部異常");}}private static MemoryStream ReadFileInRange(string filePath, long startByte, long endByte){// 驗證參數if (startByte < 0 || endByte < startByte){throw new ArgumentException("Invalid byte range");}try{using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)){// 計算要讀取的字節數long bytesToRead = endByte - startByte + 1;// 創建緩沖區byte[] buffer = new byte[bytesToRead];// 將文件流的位置設置為開始字節fileStream.Seek(startByte, SeekOrigin.Begin);// 讀取字節到緩沖區fileStream.Read(buffer, 0, (int)bytesToRead);// 創建一個MemoryStream來存儲讀取的字節MemoryStream resultStream = new MemoryStream(buffer);return resultStream;}}catch (Exception ex){// 在這里處理任何異常,比如文件未找到或讀取錯誤Console.WriteLine("Error: " + ex.Message);return null;}}

源代碼github地址:

https://github.com/LeoMingGit/dotNetPractiseCollect/blob/master/%E5%88%86%E7%89%87%E9%A2%84%E8%A7%88pdf/FileStoreController.cs

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

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

相關文章

【數據結構OJ題】移除鏈表元素

原題鏈接&#xff1a;https://leetcode.cn/problems/remove-linked-list-elements/description/ 1. 題目描述 2. 思路分析 我們可以定義一個結構體指針變量cur&#xff0c;讓cur一開始指向頭結點&#xff0c;同時定義一個結構體指針prev&#xff0c;令prev初始化為空指針NULL…

基于長短期神經網絡LSTM的碳排量預測,基于LSTM的碳排放量預測

目錄 背影 摘要 LSTM的基本定義 LSTM實現的步驟 基于長短期神經網絡LSTM的碳排放量預測 完整代碼: 基于長短期神經網絡LSTM的碳排放量預測,基于LSTM的碳排放量預測資源-CSDN文庫 https://download.csdn.net/download/abc991835105/88184632 效果圖 結果分析 展望 參考論文 背…

DIP:《Deep Image Prior》經典文獻閱讀總結與實現

文章目錄 Deep Image Prior1. 方法原理1.1 研究動機1.2 方法 2. 實驗驗證2.1 去噪2.2 超分辨率2.3 圖像修復2.4 消融實驗 3. 總結 Deep Image Prior 1. 方法原理 1.1 研究動機 動機 深度神經網絡在圖像復原和生成領域有非常好的表現一般歸功于神經網絡學習到了圖像的先驗信息…

Python解決-力扣002-兩數相加

兩數相加&#xff1a;鏈表表示的逆序整數求和 在這篇技術博客中&#xff0c;我們將討論一個力扣&#xff08;LeetCode&#xff09;上的編程題目&#xff1a;兩數相加。這個問題要求我們處理兩個非空鏈表&#xff0c;它們表示兩個非負整數。每個鏈表中的數字都是逆序存儲的&…

Redis——String類型詳解

概述 Redis中的字符串直接按照二進制的數據存儲&#xff0c;不會有任何的編碼轉換&#xff0c;因此存放什么樣&#xff0c;取出來的時候就什么樣。而MySQL默認的字符集是拉丁文&#xff0c;如果插入中文就會失敗 Redis中的字符串類型不僅可以存放文本數據&#xff0c;還可以存…

通過Python爬蟲提升網站搜索排名

目錄 怎么使用Python爬蟲提升排名 1. 抓取競爭對手數據&#xff1a; 2. 關鍵詞研究&#xff1a; 3. 網頁內容優化&#xff1a; 4. 內部鏈接建設&#xff1a; 5. 外部鏈接建設&#xff1a; 6. 監測和調整&#xff1a; 需要注意哪些方面 1. 合法性和道德性&#xff1a; …

VB+SQL期刊信息管理系統設計與實現

摘 要 本次畢業設計課題為“期刊信息管理系統”,該系統在正常運營中總是面對大量的讀者信息、期刊信息以及兩者相互作用產生的借刊信息,還刊信息。因此需要對讀者資源、期刊資源、借刊信息、還刊信息進行管理,及時了解各個環節中信息的變更,有利于提高管理效率。 此次畢…

阿里三年功能測試的一些感悟

一、前言 功能測試是測試工程師的基礎功&#xff0c;很多人功能測試還做不好&#xff0c;就想去做性能測試、自動化測試。很多人對功能測試的理解就是點點點&#xff0c;如何自己不用心去悟&#xff0c;去研究&#xff0c;那么你的職業生涯也就停留在點點點上了。在這里&#…

Flv格式視頻怎么轉MP4?視頻格式轉換方法分享

FLV格式的視頻是一種早期的視頻格式&#xff0c;不支持更高的分辨率和比特率&#xff0c;這意味著視頻的清晰度和質量受限制&#xff0c;無法很好地保留細節和質量&#xff0c;這種格式的視頻已經逐漸被更高質量的視頻格式所替代&#xff0c;例如MP4格式&#xff0c;不僅具有很…

Java基礎(七)排序算法

排序 1. 冒泡排序 >> 冒泡排序的思想 冒泡排序是一種簡單的排序算法&#xff0c;其基本思想是通過多次遍歷待排序序列&#xff0c;依次比較相鄰的元素并交換位置&#xff0c;使得每次遍歷后最大&#xff08;或最小&#xff09;的元素冒泡到序列的末尾。具體步驟如下&a…

SpringBoot+Mybatis-Plus實現增刪改查超詳細步驟

目錄 一、介紹 二、前期準備工作 &#xff08;一&#xff09; 創建springboot項目和創建數據庫 三、項目配置 &#xff08;一&#xff09;pom.xl導入相關依賴 1.導入依賴 &#xff08;二&#xff09;yml文件中配置連接數據庫 2.配置yml文件 四、代碼的編寫 數據庫展…

推斷統計(配對樣本t檢驗)

根據題目我們也可以看出配對樣本 t 檢驗是用來檢驗兩配對正態總體的均值是否存在顯著差異的一種假設檢驗方法&#xff0c;雖然是兩組數據但是其來自同一部分個體在兩個時間段內的測試數據&#xff0c;是同一部份個體&#xff01; 進行配對樣本 t 檢驗之后也是分別做出原假設和備…

【基礎學習筆記 enum】TypeScript 中的 enum 枚舉類型介紹

因為之前網上查好多博客都是只說最基礎的&#xff0c;所以這里記錄一下&#xff0c;最基礎的放在最后面。 這里重點要記錄的是枚舉成員的值可以是字符串&#xff08;字符串枚舉&#xff0c;因為網上大部分只介紹常數枚舉&#xff09;&#xff0c;需要注意的一點是&#xff0c;…

ADC實驗

查看VR1鏈接的絲印&#xff1a;XadcAIN3 設置相關寄存器 使用的是通道3&#xff0c;要設置相應的通道寄存器 #include "exynos_4412.h"int main() {unsigned int AdcValue 0;/*將ADC的精度設置成 12bit*/ADCCON ADCCON | (1 << 16);/*使能ADC的分頻器*…

SAP ABAP 直接把內表轉換成PDF格式(smartform的打印函數輸出OTF格式數據)

直接上代碼&#xff1a; REPORT zcycle055.DATA: lt_tab TYPE TABLE OF zpps001. DATA: ls_tab TYPE zpps001.ls_tab-werks 1001. ls_tab-gamng 150.00. ls_tab-gstrp 20201202. ls_tab-aufnr 000010000246. ls_tab-auart 標準生產. ls_tab-gltrp 20201205. ls_tab-matn…

MyBatis面試題

MyBatis面試題&#xff1a; 1、MyBatis是什么&#xff1f; Mybatis是一個半ORM&#xff08;對象關系映射&#xff09;框架&#xff0c;它內部封裝了JDBC&#xff0c;加載驅動、創建連接、創建statement等繁雜的過程&#xff0c;開發者開發時只需要關注如何編寫SQL語句&#xf…

榮耀X40 GT真機調試APP,HBuilder X刷新不到設備

今天使用榮耀X40GT進行真機調試App的時候&#xff0c;hbuilder怎么都刷不出來設備&#xff0c;經歷一番風雨最終連接成功&#xff0c;特此記錄一下。 我的設備Android版本12&#xff0c;MagicOS版本7.0&#xff0c;進行了如下配置&#xff1a; 1、打開“設置”-》“系統和更新”…

keil5突然編譯輸出框build output 不見了

今天keil5突然編譯輸出框build output 不見了&#xff0c;但可以編譯和下載。 首先嘗試&#xff0c;在view里面打開和關閉build output window&#xff0c;沒有反應&#xff1b; 其次&#xff0c;點擊window-reset view to defaults&#xff0c;果然build output又恢復了&#…

數據結構---圖

這里寫目錄標題 圖的基本概念和術語基本概念和術語1基本概念和術語2 圖的類型定義抽象數據類型定義二級目錄二級目錄 一級目錄二級目錄二級目錄二級目錄二級目錄二級目錄二級目錄 圖的基本概念和術語 基本概念和術語1 V代表頂點的有窮非空集合 E代表邊的有窮集合 n為頂點 有向…

數據結構與算法-棧(LIFO)(經典面試題)

一&#xff1a;面試經典 1. 如何設計一個括號匹配的功能&#xff1f;比如給你一串括號讓你判斷是否符合我們的括號原則&#xff0c; 棧 力扣 2. 如何設計一個瀏覽器的前進和后退功能&#xff1f; 思想&#xff1a;兩個棧&#xff0c;一個棧存放前進棧&…