网站做搜索引擎的作用是什么,网上怎么打广告最有效果,网站按钮设计成什么颜色原因,seo实战密码第四版电子书1前言九月太忙#xff0c;只更新了三篇文章#xff0c;本来这个功能是从九月初就开始做的#xff0c;结果一直拖到现在国庆假期才有时间完善并且写文章~之前我更新了几篇关于 Python 的文章#xff0c;有朋友留言问是不是不更新 .Net 了#xff0c;那肯定不能啊#xff0…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 TaskPost 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 ListCategory {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