基于.NetCore开发博客项目 StarBlog - (9) 图片批量导入

系列文章

  • 基于.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) 图片批量导入

  • ...

前言

前面把分类层级结构做出来了,不过还不完美,然后我就又折腾了一波,把那个组件fork了一份魔改实现了我要的效果,还顺便上传了NPM包,详情可以看这篇文章:魔改了一下bootstrap-treeview组件,发布个NPM包体验一下

文章这部分就暂时完成了,接下来是摄影模块,首先要搞定图片的批量导入。

理清需求

先来看看模型设计

public class Photo {[Column(IsIdentity = false, IsPrimary = true)]public string Id { get; set; }public string Title { get; set; }public string Location { get; set; }public string FilePath { get; set; }public long Height { get; set; }public long Width { get; set; }public DateTime CreateTime { get; set; }
}

PS:其中Location是照片的拍摄地点,FilePath是存储相对路径。

之前路线图中设定的是要支持图片Exif数据读取并自动定位,不过目前第一版没有实现,需要手动输入地点,存在Location字段中。

然后还有需要读取图片的长跟宽,保存起来,后面做瀑布流展示的时候有用。

那么,流程也理清了:扫描目录 -> 复制图片 -> 读取图片信息 -> 保存到数据库

代码实现

OK,可以开始写代码了

扫描目录和复制都比较简单,先来看看如何获取图片的尺寸。

在.Net Framework时代,框架内置有操作图片的标准库,但.Net Core时代就无了,好像是因为之前的库是跟GDI这种Windows平台独有技术绑定的,为了跨平台只能砍了

不过.NetCore有个非常厉害的ImageSharp库可以操作图片,作者是SixLabors,这名字很有意思啊,六个劳工,哈哈

读取图片

那么先来写个读取图片信息的方法

编辑StarBlog.Web/Services/PhotoService.cs文件,在PhotoService中添加方法

using SixLabors.ImageSharp;public class PhotoService {/// <summary>/// 获取图片的物理存储路径/// </summary>/// <param name="photo"></param>/// <returns></returns>private string GetPhotoFilePath(Photo photo) {return Path.Combine(_environment.WebRootPath, "media", photo.FilePath);}/// <summary>/// 重建图片数据(扫描图片的大小等数据)/// </summary>/// <param name="photo"></param>/// <returns></returns>private Photo BuildPhotoData(Photo photo) {var savePath = GetPhotoFilePath(photo);using (var img = Image.Load(savePath)) {photo.Height = img.Height;photo.Width = img.Width;}return photo;}
}

传入Photo对象,根据图片完整路径去加载,然后把宽度和高度存到对应的属性里

批量导入

接着来写批量导入的方法,完整代码见:https://github.com/Deali-Axy/StarBlog/blob/master/StarBlog.Web/Services/PhotoService.cs

public List<Photo> BatchImport() {var result = new List<Photo>();var importPath = Path.Combine(_environment.WebRootPath, "assets", "photography");var root = new DirectoryInfo(importPath);foreach (var file in root.GetFiles()) {var photoId = GuidUtils.GuidTo16String();var filename = Path.GetFileNameWithoutExtension(file.Name);var photo = new Photo {Id = photoId,Title = filename,CreateTime = DateTime.Now,Location = filename,FilePath = Path.Combine("photography", $"{photoId}.jpg")};var savePath = GetPhotoFilePath(photo);file.CopyTo(savePath, true);photo = BuildPhotoData(photo);_photoRepo.Insert(photo);result.Add(photo);}return result;
}

只扫描一层文件目录,不像博客批量导入那样递归遍历所有子目录

因为图片的没有层级结构

这个方法最后返回导入的图片列表

导入的图片会复制到StarBlog.Web/wwwroot/assets/photography

没有像导入博客那样写在单独一个Project里是因为这个功能需要用接口来调用(其实导入博客也需要,后续我会整合到blogService中)

Controller

为了有始有终,把接口这部分代码也贴一下

/// <summary>
/// 批量导入图片
/// </summary>
/// <returns></returns>
[Authorize]
[HttpPost("[action]")]
public ApiResponse<List<Photo>> BatchImport() {var result = _photoService.BatchImport();return new ApiResponse<List<Photo>> {Data = result,Message = $"成功导入{result.Count}张图片"};
}

导入完成后接口返回图片列表

实现效果

皮一下… 这部分没有图片,等下一篇介绍图片瀑布流就有啦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zookeeper 入门讲解实例 转

转 http://www.blogjava.net/BucketLi/archive/2010/12/21/341268.htmlzookeeper使用和原理探究&#xff08;一&#xff09;zookeeper介绍zookeeper是一个为分布式应用提供一致性服务的软件&#xff0c;它是开源的Hadoop项目中的一个子项目&#xff0c;并且根据google发表的&l…

小程序仿微信发现页 03《 程序员变现指南之 微信QQ 小程序 真的零基础开发宝典》

本系列教程是针对粉丝的变现教程&#xff0c;还不是粉丝的可以关注我并且到社区&#xff1a;https://bbs.csdn.net/topics/603436232 进行打卡&#xff0c;不是老粉的也可以获取最终的技术变现学习&#xff0c;最终还有详细的变现教程等你来。 前言 《 程序员变现指南之 微信…

Silverlight与WCF之间的通信(4)silverlight以net.tcp方式调用console上寄宿的wcf服务

&#xff08;由于最近是针对一个demo进行的研究&#xff0c;在之前公开过代码结构&#xff0c;这里只是对需要改动的地方加以说明&#xff09; WCF4.0使得编写wcf服务不再那么复杂&#xff0c;去掉了许多的配置信息&#xff0c;客户端只需要一个服务地址&#xff0c;便可在系统…

【空间数据库】空间数据库引擎(Spatial DataBase Engine)ArcSDE详解

一、空间数据库引擎概述 空间数据库引擎的概念最早由ESRI提出。ESRI对SDE的定义是:从空间数据管理的角度看,SDE是一个连续的空间数据模型,借助这一模型,我们可以将空间数据加人到关系数据库系统( RDBMS)中去。 SDE可以理解为基于特定的空间数据模型,在特定的数据存储、数…

Git之提示There is no tracking information for the current branch.

1 问题 我项目比如是0.2分支&#xff0c;我需要修改项目的git地址&#xff0c;然后再pull新的代码 1&#xff09;修改github地址&#xff08;读者可以忽略&#xff09; 1.git remote 查看所有远程仓库 2.git remote rm origin 删除之前的版本库 3.git remote add origin htt…

Maui学习之路(一)--Windows窗体设置

Maui的学习之路作为 Maui的先行者&#xff0c;我有话要说&#xff0c;微软你为了让我成为牛 B 的程序员真的是煞费苦心&#xff0c;你一定是觉得我不够牛逼所以针对我&#xff0c;存心想气死我。好了废话不多说&#xff0c;Maui现在也算是正式发布了&#xff0c;我有点想用它来…

Git 常用命令大全

Git 是一个很强大的分布式版本控制系统。它不但适用于管理大型开源软件的源代码&#xff0c;管理私人的文档和源代码也有很多优势。 Git常用操作命令&#xff1a; 1) 远程仓库相关命令 检出仓库&#xff1a;$ git clone git://github.com/jquery/jquery.git 查看远程仓库&#…

为什么本地使用js或jquery操作cookie在谷歌浏览器chrome中不生效?

2019独角兽企业重金招聘Python工程师标准>>> 为什么本地使用js或jquery操作cookie在谷歌浏览器chrome中不生效&#xff1f;新手学习js或jquery时&#xff0c;一般是在本地调试&#xff08;前端学习一般用不到服务器端&#xff09;&#xff0c;当学习到cookie一节时&…

全解小程序猜数字游戏 04《 程序员变现指南之 微信QQ 小程序 真的零基础开发宝典》

本系列教程是针对粉丝的变现教程&#xff0c;还不是粉丝的可以关注我并且到社区&#xff1a;https://bbs.csdn.net/topics/603436232 进行打卡&#xff0c;不是老粉的也可以获取最终的技术变现学习&#xff0c;最终还有详细的变现教程等你来。 社区有奖励 下面有投票 本文也…

Android之解决主页面Activity监听fragment退出问题(由NavHostFragment和RxFragment一起管理fragment)

1、 问题 app里面目前主页面是一个activity,然后部分fragment是由NavHostFragment管理,当splash、login等页面也放在navigation时,按手机的返回键这些页面只能一页页回退,因为设置了 app:defaultNavHost="true" 并不能在某个页面例如splash、login按返回键时退…

linux之ps命令详解

linux中ps(process status) 命令是LINUX下最常用的也是非常强大的进程查看命令&#xff0c;运用该命令可以确定有哪些进程正在运行和运行地状态、进程是否结束、进程有没有僵死、哪些进程占用了过多地资源等等。 ps命令最常用的是用于监控后台进程的工作情况。 Linux 查看进程p…

【空间数据库】传统数据模型(层次、网状、关系)和空间数据模型详解

数据模型是指数据库的组织形式,它决定了数据库中数据之间联系的表达方式,即把在计算机中表示客观事物及其联系的数据及结构称为数据模型。本文详细讲述传统三大数据模型和空间数据模型。 一、数据模型概述 数据模型是指数据库的组织形式,它决定了数据库中数据之间联系的表…

聊聊 C# 中的多态底层 (虚方法调用) 是怎么玩的

最近在看 C 的虚方法调用实现原理&#xff0c;大概就是说在 class 的首位置存放着一个指向 vtable array 指针数组 的指针&#xff0c;而 vtable array 中的每一个指针元素指向的就是各自的 虚方法&#xff0c;实现方式很有意思&#xff0c;哈哈&#xff0c;现在我很好奇 C# 中…

sublime text 3 安装、添加命令行启动、汉化、注册码

1. 安装sublime&#xff1a; 下载&#xff1a;http://www.sublimetext.com/3 添加命令行启动&#xff1a;设置环境变量->计算机->右键属性->高级系统设置->环境变量->系统变量->Path->编辑&#xff0c;加入";安装路径"(如&#xff1a;;D:\Progr…

MVC基础知识-View

public ActionResult Index() {ViewBag.Message "Modify this template to jump-start your ASP.NET MVC application.";//展现到视图中数据//~/Views/Home/Index.cshtmlreturn View(); //展现指定的视图&#xff0c;当没有指定视图名称时&#xff0c;默认是指向根目…

Android之设置当前app为默认浏览器研究

1 需求 把当前app设置为默认浏览器 2 主要思路 分析竞品,我们主要通过2种方式设置app为默认浏览器 直接跳 手机“设置默认应用”界面来让用户选择 默认浏览器为哪个app打开一个链接,拉起手机所有浏览器,让用户去选择哪个浏览器,并且只有点击“始终”才会生效,仅仅点击“…

Linux下的用户和组

2019独角兽企业重金招聘Python工程师标准>>> 用户和组 GNU/Linux 通过用户和用户组实现访问控制 —— 包括对文件访问、设备使用的控制。Linux 默认的访问控制机制相对简单直接&#xff0c;不过还有一些更加高级的机制&#xff0c;包括 ACL 和 LDAP Authentication.…

漫画C语言 做个聊天软件你不懂也得懂

学完C语言做不出东西&#xff1f;不存在的&#xff0c;咱们做一个最“隐私”的聊天器&#xff0c;就俩人&#xff0c;你和我。咱们聊天的信息你知我知没别人知。 对了&#xff0c;本文评论区点赞、收藏抽奖。 社区也有抽奖&#xff0c;本周社区抽奖帖子 &#xff1a;https://b…

【Microstation】第一章:Microstation三维模型构建概述

MicroStation 是国际上和AutoCAD齐名的二维和三维CAD设计软件&#xff0c;第一个版本由Bentley兄弟在1986年开发完成。其专用格式是DGN&#xff0c;并兼容AutoCAD的DWG/DXF等格式。 MicroStation是Bentley 工程软件系统有限公司在建筑、土木工程、交通运输、加工工厂、离散制造…

libgdx游戏引擎开发笔记(十)SuperJumper游戏例子的讲解(篇四)---- 主游戏界面内部框架编写...

上一讲&#xff0c;我们已经实现了点击play进入游戏界面但仅仅是个黑屏 今天&#xff0c;我们就试着编写代码让它出现游戏的一些简单场景。还是在上一讲的代码基础上&#xff0c;我们创建两个类&#xff1a;World 和 WorldRenderer 1.Word类&#xff1a; 12345678910111213141…