18 基于.NetCore开发博客项目 StarBlog - 实现本地Typora文章打包上传

前言九月太忙 , 只更新了三篇文章 , 本来这个功能是从九月初就开始做的 , 结果一直拖到现在国庆假期才有时间完善并且写文章~
之前我更新了几篇关于 Python 的文章 , 有朋友留言问是不是不更新 .Net 了 , 那肯定不能啊 , 我只能说「我 全 都 要」 , 所以我反手就更新了一篇Asp-Net-Core开发笔记 。
然后顺便立个Flag:今年底前完成StarBlog系列文章的主体部分(即API开发+后台前端开发 , 目前只完成博客前后端部分) , 加油吧~
OK , 说回本文 , 程序员都喜欢用Markdown来写文章 , 但由于markdown是纯文本格式 , 在其中插入的图片要如何保存 , 就成了一大烦恼 , 有人选择图床 , 但不一定永久有效;有人选择本地存储 , 图片永久有效 , 但如何分享文章又成了一个难题…
我选的就是第二种 , 本地存储 。使用Typora写文章 , 图片保存在和Markdown文件同名的目录(markdown.assets)下 , 这样可以获得很好的写作体验 , 然后分享的问题就交给StarBlog吧 , 这个项目开发的初衷就是为了把本地的文章发表成博客 。
不过之前只有批量导入文章的功能 , 现在我要做的就是单独实现一个单篇文章打包导入的功能 。

随着文章越来越多 , 系列文章的目录放前面有点影响阅读了 , 所以从这篇开始我把它放到最后面~
实现思路假设我用Typora写了一篇Markdown文章 , 文件名为:StarBlog.md , 并且在里面插入了若干图片 , 根据配置 , Typora会自动生成一个目录(StarBlog.assets)来存放这些图片 。
为了实现导入 , 我要把这个markdown文件和这个存图片的目录一起打包成zip压缩文件上传 , 后端将zip压缩包解压到临时目录 , 读取Markdown文件 , 解析其中的内容 , 进行导入操作 。
代码实现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  , 在本系列一开始就写过 , 所以这里就不再当复读机了 , 可以直接看这两篇文章:

经验总结扩展阅读