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

1前言

九月太忙,只更新了三篇文章,本來這個功能是從九月初就開始做的,結果一直拖到現在國慶假期才有時間完善并且寫文章~

之前我更新了幾篇關于 Python 的文章,有朋友留言問是不是不更新 .Net 了,那肯定不能啊,我只能說「我 全 都 要」,所以我反手就更新了一篇Asp-Net-Core開發筆記。

然后順便立個Flag:今年底前完成StarBlog系列文章的主體部分(即API開發+后臺前端開發,目前只完成博客前后端部分),加油吧~

OK,說回本文,程序員都喜歡用Markdown來寫文章,但由于markdown是純文本格式,在其中插入的圖片要如何保存,就成了一大煩惱,有人選擇圖床,但不一定永久有效;有人選擇本地存儲,圖片永久有效,但如何分享文章又成了一個難題…

我選的就是第二種,本地存儲。使用Typora寫文章,圖片保存在和Markdown文件同名的目錄(markdown.assets)下,這樣可以獲得很好的寫作體驗,然后分享的問題就交給StarBlog吧,這個項目開發的初衷就是為了把本地的文章發表成博客。

不過之前只有批量導入文章的功能,現在我要做的就是單獨實現一個單篇文章打包導入的功能。

隨著文章越來越多,系列文章的目錄放前面有點影響閱讀了,所以從這篇開始我把它放到最后面~

2實現思路

假設我用Typora寫了一篇Markdown文章,文件名為:StarBlog.md,并且在里面插入了若干圖片,根據配置,Typora會自動生成一個目錄(StarBlog.assets)來存放這些圖片。

為了實現導入,我要把這個markdown文件和這個存圖片的目錄一起打包成zip壓縮文件上傳,后端將zip壓縮包解壓到臨時目錄,讀取Markdown文件,解析其中的內容,進行導入操作。

3代碼實現

OK,開始寫代碼吧

同時所有項目代碼已經上傳GitHub,歡迎各位大佬Star/Fork!

  • 博客后端+前臺項目地址:https://github.com/Deali-Axy/StarBlog

  • 管理后臺前端項目地址:https://github.com/Deali-Axy/StarBlog-Admin

解壓縮

首先是解壓縮功能,.Net標準庫自帶 ZipFile 這個庫用于操作zip壓縮包,在 System.IO.Compression 里,直接用就完事了。

解壓前得先把文件復制到臨時目錄,并創建一個新的臨時目錄來放解壓后的文件。

Services/BlogServices.cs 里新增代碼

public?async?Task<Post>?Upload(PostCreationDto?dto,?IFormFile?file)?{//?先復制到臨時文件var?tempFile?=?Path.GetTempFileName();await?using?(var?fs?=?new?FileStream(tempFile,?FileMode.Create))?{await?file.CopyToAsync(fs);}//?設定解壓用的臨時目錄var?extractPath?=?Path.Combine(Path.GetTempPath(),?"StarBlog",?Guid.NewGuid().ToString());//?使用?GBK?編碼解壓,防止中文文件名亂碼Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);ZipFile.ExtractToDirectory(tempFile,?extractPath,?Encoding.GetEncoding("GBK"));
}

本來直接 ZipFile.ExtractToDirectory() 就能解壓了,但如果壓縮包里的文件用了中文名,就得先設置編碼。

解析Markdown

關于 C# 解析 Markdown ,在本系列一開始就寫過,所以這里就不再當復讀機了,可以直接看這兩篇文章:

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

  • C#解析Markdown文檔,實現替換圖片鏈接操作

直接上代碼了

因為是做單篇文章導入,所以我這里獲取臨時目錄寫的所有 *.md 文件之后只取第一個文件來處理(理論上也不應該有多個~)

var?dir?=?new?DirectoryInfo(extractPath);
var?files?=?dir.GetFiles("*.md");
var?mdFile?=?files.First();
using?var?reader?=?mdFile.OpenText();
var?content?=?await?reader.ReadToEndAsync();
var?post?=?new?Post?{Id?=?GuidUtils.GuidTo16String(),Status?=?"已發布",Title?=?dto.Title????$"{DateTime.Now.ToLongDateString()}?文章",IsPublish?=?true,Content?=?content,Path?=?"",CreationTime?=?DateTime.Now,LastUpdateTime?=?DateTime.Now,CategoryId?=?dto.CategoryId,
};var?assetsPath?=?Path.Combine(_environment.WebRootPath,?"media",?"blog");
var?processor?=?new?PostProcessor(extractPath,?assetsPath,?post);//?處理文章標題和狀態
processor.InflateStatusTitle();//?處理文章正文內容
//?導入文章的時候一并導入文章里的圖片,并對圖片相對路徑做替換操作
post.Content?=?processor.MarkdownParse();
post.Summary?=?processor.GetSummary(200);

Markdown相關的處理,我封裝了 PostProcessor 這個對象,在 StarBlog.Share 里。

處理多級分類

如果文章的分類不是一級分類,那么把它上面的所有分類找出來,一個個排好隊,方便后面處理。

//?處理多級分類
var?category?=?await?_categoryRepo.Where(a?=>?a.Id?==?dto.CategoryId).FirstAsync();
if?(category?==?null)?{post.Categories?=?"0";
}
else?{var?categories?=?new?List<Category>?{category};var?parent?=?category.Parent;while?(parent?!=?null)?{categories.Add(parent);parent?=?parent.Parent;}categories.Reverse();post.Categories?=?string.Join(",",?categories.Select(a?=>?a.Id));
}

最后保存

搞定~

//?存入數據庫
post?=?await?_postRepo.InsertAsync(post);

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文章打包上傳

5參考資料

  • https://www.cnblogs.com/liguix/p/11883248.html

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

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

相關文章

《算法導論》讀書筆記--第1、2章課后題 (轉)

第一章 轉自http://www.cnblogs.com/batteryhp/p/4654860.html 思考題 1-1&#xff08;運行時間的比較&#xff09;確定時間t內求解的問題的最大規模。 上面是網上提供的答案。 注意點&#xff1a; 1、最左邊一列的是關于n的增長情況描述&#xff0c;值得記住的是這些增長的排…

PHP開發自己的框架必備知識點

一、PHP常用的四種數據結構 簡介&#xff1a;spl是php的一個標準庫。 官方文檔&#xff1a;http://php.net/manual/zh/book.spl.php <?php//spl&#xff08;php標準庫&#xff09;數據結構/*** 棧&#xff08;先進后出&#xff09;*/ $stack new SplStack(); $stack-&g…

Linux 環境下 jdk1.8 maven3.2.3 Git2.8.0 安裝腳本

2019獨角獸企業重金招聘Python工程師標準>>> # Author: peizhouyu # Date: 2018-09-07 14:24:11 # Last Modified by: peizhouyu # Last Modified time: 2018-09-07 16:02:58#!/bin/bash SOFT_PATH/opt/softif [ ! -d $SOFT_PATH ];then mkdir $SOFT_PATH else …

《嵌入式設備驅動開發精解》——導讀

前言 嵌入式設備驅動開發精解本書的編寫主要是針對從事嵌入式軟件開發人員。本書的內容主要涵蓋ARM CPU以及各種常用外部設備驅動開發的方方面面&#xff0c;包括各種硬件接口、硬件接口協議說明以及各種外設的使用及調試方法&#xff0c;特別是對于開發調試過程中可能遇到的各…

C# WPF通過WindowChrome自定義窗體

概述在WPF界面開發中&#xff0c;系統默認的窗口比較丑&#xff0c;有時候想自定義窗體&#xff0c;比如微信的客戶端窗口這樣&#xff1a;使得左邊的一塊頂到最上端&#xff0c;如下圖所示&#xff1a;這時候我們可以 WindowStyle"None"&#xff0c;AllowsTranspare…

【轉載】遞推公式的特征方程及通項公式

先貼上鏈接&#xff1a;http://blog.csdn.net/happykocola/article/details/73933314 因為最近在復習初賽&#xff0c;然后碰到了這道題&#xff0c;并不會做&#xff0c;才發現有這么高明的方法... 已知遞推關系式&#xff1a; f(n)5f(n-1)-6f(n-2) (n>1) f(0)1 f(1)…

【leetcode】75. Sort Colors

題目如下&#xff1a; 解題思路&#xff1a;我的解題思路是遍歷數組&#xff0c;遇到0刪除該元素并插入到數組頭部&#xff0c;遇到1則不處理&#xff0c;遇到2刪除該元素并插入到數組尾部。 代碼如下&#xff1a; class Solution(object):def sortColors(self, nums):"&q…

每日一言學做人,古之學問,博大精深

前言&#xff1a; 要成為一個有格局&#xff0c;有修養的人&#xff0c;吸納一些有道理的思想和做法&#xff0c;去逐漸提高自己是非常有必要的&#xff0c;有一言&#xff0c;做事先做人&#xff0c;意即于此。因此&#xff0c;每日將自己看到的一段有感的話記錄下來&#xf…

Seal-Report: 開放式數據庫報表工具

Seal Report是.Net的一個基于Apache 2.0 開源工具&#xff0c;完全用C# 語言編寫&#xff0c;最新的6.6 版本采用.NET 6&#xff0c;github: https://github.com/ariacom/Seal-Report。Seal Report提供了一個完整的框架&#xff0c;用于從任何數據庫或任何非SQL源生成每日報告。…

《Ceph源碼分析》——第2章,第2節Buffer

本節書摘來自華章出版社《Ceph源碼分析》一書中的第2章&#xff0c;第2.2節Buffer&#xff0c;作者常濤&#xff0c;更多章節內容可以訪問云棲社區“華章計算機”公眾號查看 2.2 BufferBuffer就是一個命名空間&#xff0c;在這個命名空間下定義了Buffer相關的數據結構, 這些數…

eclipse在server中tomcat server找不到的問題

想要在eclipse的server新建tomcat服務器然而不知道怎么回事找不到Tomcat 7.0 Server 下面的紅圈是tomcat server服務器&#xff08;更新后才出現&#xff09; 網上找的很久&#xff0c;只是找到在eclipse中安裝tomcat插件的方法 Tomcat免安裝版的環境變量配置以及Eclipse下的To…

Sysbench 1.0.15安裝及使用

Sysbench是一款開源的多線程性能測試工具&#xff0c;可以執行CPU/內存/線程/IO/數據庫等方面的性能測試&#xff0c;數據庫目前支持MySQL/Oracle/PostgreSQL。 一、安裝&#xff1a; Github地址&#xff1a;https://github.com/akopytov/sysbench RHEL/CentOS&#xff1a; cur…

PHP根據指定url生成二維碼圖片

一、composer安裝 http://packagist.p2hp.com/packages/codeitnowin/barcode 二、使用 調用generateQrCode()方法即可實現生成二維碼圖片并輸出下載給用戶 <?php namespace manage\Test;use CodeItNow\BarcodeBundle\Utils\QrCode; use common\extensions\Helper; use y…

CA 周記 - 派福利!通過 Azure 零成本進入 CUDA 編程

我們在配置深度學習環境的時候&#xff0c;除了安裝各種庫和框架外&#xff0c;如果需要 GPU 加速&#xff0c;還需要配置 CUDA 。那 CUDA 是什么 &#xff1f;它的作用是什么 &#xff1f;CUDA 編程介紹01什么是 CUDA&#xff1f;CUDA (Compute Unified Device Architecture) …

《視圖更新與關系數據庫理論》——2.1 關系和關系變量

本節書摘來自異步社區出版社《視圖更新與關系數據庫理論》一書中的第2章&#xff0c;第2.1節&#xff0c;作者&#xff1a;【美】C.J. Date&#xff08;達特&#xff09;&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 2.1 關系和關系變量 每一個關系都有一…

盜取手機敏感信息,Android 6.0之上兼容

盜取手機敏感信息&#xff0c;Android 6.0之上兼容 項目介紹 盜取信息包含&#xff1a; 手機中所有照片手機中所有視頻手機中所有通訊錄手機中所有短信手機中所有通話記錄手機中所有安裝應用兼容Android 6.0及之上版本動態權限申請工具開放效果展示 1.照片信息 MaterialBean{mL…

再記一次Memory Leak分析

性能是優化出來的&#xff0c;不管是在上生產前&#xff0c;還是在上生產后。大部分性能在性能測試階段就能發現問題&#xff0c;但也有一些性能問題&#xff0c;結合生產的環境&#xff0c;生產數據才能表現出來&#xff0c;成為一個顯著的瓶頸。這次是生成pdf造成的內存泄露&…

PHP格式化全國省市區列表

一、代碼部分 /*** 獲取全國省市區列表&#xff08;格式化后&#xff09;*/public function getRegionList(){$data CoreRegion::find()->select([national_code, region_name, parent_id, region_level])->asArray()->all();$data $this->assembleRegionData($…

《C語言開發從入門到精通》一2.4 技術解惑

本節書摘來自異步社區《C語言開發從入門到精通》一書中的第2章&#xff0c;第2.4節&#xff0c;作者王長青 , 韓海玲&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 2.4 技術解惑 2.4.1 安裝Visual Studio的幾個常見問題 Visual Studio 2010容量巨大&…

POM思想__首頁頁面元素查找、功能點實現進行封裝

一、代碼如下 package www.gui.huohu.pom;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.sele…