Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程

简介: Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一)图片或者文件上传相信大家在开发中应该都会用到吧,有的时候还要对图片生成缩略图。那么如何在Asp.Net Core Web Api实现图片上传存储以及生成缩略图呢?今天我就使用MongoDB作为图片存储,然后使用SixLabors作为图片处理,通过一个Asp.

Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一)

图片或者文件上传相信大家在开发中应该都会用到吧,有的时候还要对图片生成缩略图。那么如何在Asp.Net Core Web Api实现图片上传存储以及生成缩略图呢?今天我就使用MongoDB作为图片存储,然后使用SixLabors作为图片处理,通过一个Asp.Net Core Web Api实例来给大家讲解下!本文有点长,可以先收藏推荐然后再看!
本文地址:https://www.cnblogs.com/yilezhu/p/9297009.html
作者:yilezhu

写在前面

阅读本文章,需要你具备asp.net core的基础知识,至少能够创建一个Asp.Net Core Web Api项目吧!其次,我不会跟你说MongoDB是什么以及为什么选择MongoDB作为文件存储这样的问题,因为百度百科已经给你说了, MongoDB 是一个基于分布式文件存储的数据库。实在不清楚的话自己去看百度百科吧!

MongoDB在Windows下的下载安装以及配置

你可以从MongoDB官网下载安装。下载地址:https://www.mongodb.com/download-center#community 。如下图所示:

MongoDB下载

下载之后一路next基本就能完成。当然还是给新手朋友一些图文操作吧。已经会安装的朋友可以跳过这一节往下看。

MongoDB安装

MongoDB服务配置

一路next,然后安装出现最后安装成功的界面,点击Finish即可。

MongoDB安装完成

然后,Win+R 运行,输入services.msc 然后输入Enter键。打开如下的服务窗口

MongoDB服务
双击上面圈起来的MongoDB服务,可以看到如下参数命令

MongoDB启动参数

"C:\Program Files\MongoDB\Server\4.0\bin\mongod.exe" --config "C:\Program Files\MongoDB\Server\4.0\bin\mongod.cfg" --service

上面表示,MongoDB作为服务的方式进行启动,并且按照 --Config后面的路径里面的配置文件里的配置进行启动。

我们找到这个配置文件,并打开看下吧!

MongoDB配置

你可以重新设置参数后,然后重新启动服务即可生效!
最后,让我们浏览器打开上面设置的IP以及端口号查看一下,如下图所示,表示MongoDB安装成功!

MongoDB安装成功

Asp.Net Core Web Api图片上传的代码实现

  1. 新建Asp.Net Core Web Api项目
    这里我不会教你怎么创建一个Asp.Net Core Web Api项目了。创建好后会出现如下图所示的结构

目录结构

  1. 安装MongoDB的nuget包以及SixLabors图片处理的包

    Install-Package MongoDB.Bson -Version 2.7.0
    Install-Package MongoDB.Driver -Version 2.7.0
    Install-Package SixLabors.ImageSharp -Version 1.0.0-beta0004
    Install-Package SixLabors.ImageSharp.Drawing -Version 1.0.0-beta0004
  2. 在appsettings.json中加入MongoDBHost的配置,如下所示,端口以及ip上面我们已经配置过了

    {
      "Logging": {
        "LogLevel": {
          "Default": "Warning"
        }
      },
      "MongodbHost": {
        "Connection": "mongodb://127.0.0.1:27017",
        "DataBase": "File_Server",
        "Table": ""
      },
      "PictureOptions": {
        "FileTypes": ".gif,.jpg,.jpeg,.png,.bmp,.GIF,.JPG,.JPEG,.PNG,.BMP",
        "MaxSize": 1048576,
        "ThumsizeW": 200,
        "ThumsizeH": 140,
        "MakeThumbnail": true,
        "ThumbnailGuidKeys": "yilezhu",
        "ImageBaseUrl": "http://localhost:5002/api/Picture/Show/"
      }
    }
    
  3. 既然有了配置,肯定要创建对应的Options了。MongodbHostOptions以及PictureOptions的代码如下所示:

   public class MongodbHostOptions
    {
        /// <summary>
        /// 连接字符串
        /// </summary>
        public string Connection { get; set; }
        /// <summary>
        /// 库
        /// </summary>
        public string DataBase { get; set; }
        /// <summary>
        /// 表
        /// </summary>
        public string Table { get; set; }
    }

    public class PictureOptions
    {
        /// <summary>
        /// 允许的文件类型
        /// </summary>
        public string FileTypes { get; set; }
        /// <summary>
        /// 最大文件大小
        /// </summary>
        public int MaxSize { get; set; }
        /// <summary>
        /// 缩略图宽度
        /// </summary>
        public int ThumsizeW { get; set; }
        /// <summary>
        /// 缩略图高度
        /// </summary>
        public int ThumsizeH { get; set; }
        /// <summary>
        /// 是否缩略图
        /// </summary>
        public bool MakeThumbnail { get; set; }
        /// <summary>
        /// 图片的基地址
        /// </summary>
        public string ImageBaseUrl { get; set; }
    }
  1. 服务注册中进行注入
//MongodbHost信息
services.Configure<MongodbHostOptions>(Configuration.GetSection("MongodbHost"));
//图片选项
services.Configure<PictureOptions>(Configuration.GetSection("PictureOptions"));
  1. 新建一个PictureController用来作为图片上传的api,里面包含图片上传接口,删除接口,以及显示接口,上传接受一个base64的图片字符串,然后生成缩略图,然后存储到MongoDB数据库中,全部代码如下所示:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Options;
    using MongoDBDemo.Dtos;
    using MongoDBDemo.Helper;
    using MongoDBDemo.Models;
    using MongoDBDemo.Options;
    using MongoDBDemo.Result;
    
    namespace MongoDBDemo.Controllers
    {
    
        /// <summary>
        /// yilezhu
        /// 2018.7.10
        /// 图片操作相关接口
        /// </summary>
        public class PictureController : BaseController
        {
            // MongodbHost信息
            private readonly MongodbHostOptions _mongodbHostOptions;
    
            // 图片选项
            private readonly PictureOptions _pictureOptions;
    
            /// <summary>
            /// 构造函数注入
            /// </summary>
            /// <param name="mongodbHostOptions">MongodbHost信息</param>
            /// <param name="pictureOptions">图片选项</param>
            public PictureController(IOptions<MongodbHostOptions> mongodbHostOptions, IOptions<PictureOptions> pictureOptions)
            {
                _mongodbHostOptions = mongodbHostOptions.Value;
                _pictureOptions = pictureOptions.Value;
            }
    
            /// <summary>
            /// 接口上传图片方法
            /// </summary>
            /// <param name="fileDtos">文件传输对象,传过来的json数据</param>
            /// <returns>上传结果</returns>
            [HttpPost]
            public async Task<UploadResult> Post([FromBody] FileDtos fileDtos)
            {
                UploadResult result = new UploadResult();
                if (ModelState.IsValid)
                {
                    #region  验证通过
                    //首先根据api参数判断是否为图片类型,是则处理,不是则返回对应的结果
                    if (!string.IsNullOrEmpty(fileDtos.Type) && fileDtos.Type.ToLower() == "image")
                    {
                        //文件类型
                        string FileEextension = Path.GetExtension(fileDtos.Filename).ToLower();//获取文件的后缀
                                                                                               //判断文件类型是否是允许的类型
                        if (_pictureOptions.FileTypes.Split(',').Contains(FileEextension))
                        {
                            //图片类型是允许的类型
                            Images_Mes fmster = new Images_Mes();//图片存储信息类,跟MongoDB里面表名一致
                            string fguid = Guid.NewGuid().ToString().Replace("-",""); //文件名称
                            fmster.AddTime = DateTimeOffset.Now;//添加时间为当前时间
                            fmster.AddUser = "server";//具体根据你的业务来获取
                            if (Base64Helper.IsBase64String(fileDtos.Base64String, out byte[] fmsterByte))
                            {
                                //判断是否是base64字符串,如果是则转换为字节数组,用来保存
                                fmster.FileCon = fmsterByte;
                            }
                            fmster.FileName = Path.GetFileName(fileDtos.Filename);//文件名称
                            fmster.FileSize = fmster.FileCon.Length;//文件大小
                            fmster.FileType = FileEextension;//文件扩展名
                            fmster.GuidID = fguid;//唯一主键,通过此来获取图片数据
                            await MongodbHelper<Images_Mes>.AddAsync(_mongodbHostOptions, fmster);//上传文件到mongodb服务器
                                                                                                  //检查是否需要生产缩略图
                            if (_pictureOptions.MakeThumbnail)
                            {
                                //生成缩略图
                                Images_Mes fthum = new Images_Mes();
                                fthum.AddTime = DateTimeOffset.Now;
                                fthum.AddUser = "server";//具体根据你的业务来获取
                                fthum.FileCon = ImageHelper.GetReducedImage(fmster.FileCon, _pictureOptions.ThumsizeW, _pictureOptions.ThumsizeH);
                                fthum.FileName = Path.GetFileNameWithoutExtension(fileDtos.Filename) + "_thumbnail" + Path.GetExtension(fileDtos.Filename);//生成缩略图的名称
                                fthum.FileSize = fthum.FileCon.Length;//缩略图大小
                                fthum.FileType = FileEextension;//缩略图扩展名
                                fthum.GuidID = fguid + _pictureOptions.ThumbnailGuidKeys;//为了方面,缩略图的主键为主图主键+一个字符yilezhu作为主键
                                await MongodbHelper<Images_Mes>.AddAsync(_mongodbHostOptions, fthum);//上传缩略图到mongodb服务器
                            }
                            result.Errcode = ResultCodeAddMsgKeys.CommonObjectSuccessCode;
                            result.Errmsg = ResultCodeAddMsgKeys.CommonObjectSuccessMsg;
                            UploadEntity entity = new UploadEntity();
                            entity.Picguid = fguid;
                            entity.Originalurl = _pictureOptions.ImageBaseUrl + fguid;
                            entity.Thumburl = _pictureOptions.ImageBaseUrl + fguid + _pictureOptions.ThumbnailGuidKeys;
                            result.Data = entity;
                            return result;
                        }
                        else
                        {
                            //图片类型不是允许的类型
                            result.Errcode = ResultCodeAddMsgKeys.HttpFileInvalidCode;//对应的编码
                            result.Errmsg = ResultCodeAddMsgKeys.HttpFileInvalidMsg;//对应的错误信息
                            result.Data = null;//数据为null
                            return result;
                        }
    
                    }
                    else
                    {
                        result.Errcode = ResultCodeAddMsgKeys.HttpFileNotFoundCode;
                        result.Errmsg = ResultCodeAddMsgKeys.HttpFileNotFoundMsg;
                        result.Data = null;
                        return result;
                    }
                    #endregion
                }
                else
                {
                    #region 验证不通过
                    StringBuilder errinfo = new StringBuilder();
                    foreach (var s in ModelState.Values)
                    {
                        foreach (var p in s.Errors)
                        {
                            errinfo.AppendFormat("{0}||", p.ErrorMessage);
                        }
                    }
                    result.Errcode = ResultCodeAddMsgKeys.CommonModelStateInvalidCode;
                    result.Errmsg = errinfo.ToString();
                    result.Data = null;
                    return result;
                    #endregion
                }
            }
    
            /// <summary>
            /// 删除图片
            /// </summary>
            /// <param name="guid">原始图片主键</param>
            /// <returns>执行结果</returns>
            [HttpDelete("{guid}")]
            public async Task<BaseResult> Delete(string guid)
            {
                await MongodbHelper<Images_Mes>.DeleteAsync(_mongodbHostOptions, guid);//删除mongodb服务器上对应的文件
                await MongodbHelper<Images_Mes>.DeleteAsync(_mongodbHostOptions, guid + _pictureOptions.ThumbnailGuidKeys);//删除mongodb服务器上对应的文件
                return new BaseResult(ResultCodeAddMsgKeys.CommonObjectSuccessCode, ResultCodeAddMsgKeys.CommonObjectSuccessMsg);
            }
    
            /// <summary>
            /// 返回图片对象
            /// </summary>
            /// <param name="guid">图片的主键</param>
            /// <returns>图片对象</returns>
            [Route("Show/{guid}")]
            [HttpGet]
            public async Task<FileResult> ShowAsync(string guid)
            {
                if (string.IsNullOrEmpty(guid))
                {
                    return null;
                }
                FilterDefinition<Images_Mes> filter = Builders<Images_Mes>.Filter.Eq("GuidID", guid);
                var result= await MongodbHelper<Images_Mes>.FindListAsync(_mongodbHostOptions, filter);
                if (result != null && result.Count > 0)
                {
                    return File(result[0].FileCon, "image/jpeg", result[0].FileName);
                }
                else
                {
                    return null;
                }
    
            }
        }
    }
    1. 下面我们先连接下MongoDB看下里面内容如下:

      win7系统MongoDB操作软件显示有点问题,将就将就吧!

      MongoDB数据库

  2. 打开Postman进行图片上传操作,方法选择“Post”,参数格式选择json,然后输入对应的参数格式,如下图所示,都有标注,相信你都能看懂:

    PostMan测试

  3. 参数输入完毕之后,最后点击右侧的“Send”按钮进行测试,看到如下所示的返回结果:

Postman测试结果

  1. 我们接下来利用工具查询下MongoDB,看看有没有生成对应的数据库以及Collections如下图所示,可以看到生成了我们定义的File_Server数据库以及Images_Mes集合

    执行后的MongoDB数据库

  2. 查询下看看里面的数据可以看到里面的数据正是结果返回的数据,说明我们的结果是正确的,如下所示:

    MongoDB查询结果

  3. 最后应该打开浏览器,然后输入图片地址,浏览器就会自动下载图片了,效果如下所示:

    浏览器打开图片

    示例代码

    [点我下载][https://github.com/yilezhu/ImageUploadApiDemo]

总结

教程已经写完了,细心地朋友应该能够看到,大部分代码都是昨天晚上写的,今天晚上又稍加修改完成的!一篇文章足足消耗了两个晚上,希望大家能多多支持!
总结中说了一句废话!莫怪啊!本篇文章首先介绍了MongoDB的安装,然后创建了一个新的Asp.Net Core Web Api项目,然后通过一个图片上传的实例来讲述了Asp.Net Core中图片上传的操作,以及MongoDB作为图片存储的实现!当然中间用到了图片缩略图的生成,最后写了一个简单地图片展示。希望本篇关于Asp.Net Core Web Api图片上传及MongoDB存储的实例教程能对大家使用Asp.Net Core Web Api进行图片上传以及MongoDB的使用有多帮助!
最后,还是希望大家多多推荐,多多支持!下面我会继续完善下代码,加入IdentityServer认证,以及SwaggerUI实现接口文档,但是Ocelot网关技术以及consul实现服务发现以及故障的邮件发送等等功能就不在此项目代码中应用了!

如果您认为这篇文章还不错或者有所收获,您可以点击右下角的【推荐】按钮精神支持,因为这种支持是我继续写作,分享的最大动力!
作者:yilezhu(依乐祝).NET Core实战项目交流群:637326624
声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!另如需修改文章内容请与本人联系。微信账号:jkingzhu
目录
相关文章
|
10月前
|
开发框架 .NET C#
ASP.NET Core Blazor 路由配置和导航
大家好,我是码农刚子。本文系统介绍Blazor单页应用的路由机制,涵盖基础配置、路由参数、编程式导航及高级功能。通过@page指令定义路由,支持参数约束、可选参数与通配符捕获,结合NavigationManager实现页面跳转与参数传递,并演示用户管理、产品展示等典型场景,全面掌握Blazor路由从入门到实战的完整方案。
730 6
|
人工智能 搜索推荐 API
自学记录鸿蒙API 13:实现人脸比对Core Vision Face Comparator
在完成文本识别和人脸检测项目后,我深入学习了HarmonyOS Next API 13中的Core Vision Face Comparator API,开发了一个简单的人脸比对工具。该API能进行高精度人脸比对并给出相似度评分,应用场景广泛,如照片分类、身份认证、个性化服务等。通过初始化服务、加载图片、实现比对功能和构建用户界面,最终实现了可靠的人脸比对功能。未来计划将此技术应用于更复杂的场景,如照片管理和个性化服务,并探索与其他AI能力的结合。如果你也对人脸比对感兴趣,不妨从简单的比对功能开始,逐步实现自己的创意!
534 61
|
人工智能 自然语言处理 文字识别
自学记录鸿蒙API 13:实现智能文本识别Core Vision Text Recognition
在完成语音助手项目后,我尝试了HarmonyOS Next API 13中的Core Vision Text Recognition API,体验其强大的文本识别功能。该API支持多语言高精度识别,能快速将图像中的文本提取为结构化信息,适用于文档扫描、票据管理和实时翻译等场景。通过权限配置、初始化服务、实现识别功能和构建用户界面,我完成了文本识别应用的开发,并探索了性能优化与功能扩展。鸿蒙生态的强大支持让开发者能更便捷地实现复杂功能。未来计划将此技术应用于实际项目,如票据管理或实时翻译工具。如果你也对文本识别感兴趣,不妨一起探索!
473 11
|
人工智能 监控 安全
自学记录鸿蒙 API 13:骨骼点检测应用Core Vision Skeleton Detection
骨骼点检测技术能够从图片中识别出人体的关键骨骼点位置,如头部、肩部、手肘等,广泛应用于运动健身指导、游戏交互、医疗辅助、安全监控等领域。我决定深入学习HarmonyOS Next API 13中的Skeleton Detection API,并开发一个简单的骨骼点检测应用。通过理解API核心功能、项目初始化与配置、实现检测功能、构建用户界面,以及性能优化和功能扩展,逐步实现这一技术的应用。未来计划将其应用于健身指导和智能监控领域,探索与其他AI能力的结合,开发更智能的解决方案。如果你也对骨骼点检测感兴趣,不妨一起进步!
605 9
|
人工智能 监控 安全
自学记录鸿蒙 API 13:实现人脸检测 Core Vision Face Detector
本文介绍了基于HarmonyOS Next API 13中的Core Vision Face Detector API实现人脸检测小应用的过程。通过研究发现,该API不仅支持人脸检测框的定位,还能识别关键点(如眼睛、鼻子和嘴角位置)及人脸姿态信息。文章详细记录了开发历程,包括项目初始化、权限配置、图像加载与人脸检测、用户界面设计,以及性能优化和功能扩展的思路。应用场景涵盖身份验证、照片管理和实时交互等。未来计划将技术应用于智能照片管理工具,提供更高效的照片分类体验。欢迎对人脸检测技术感兴趣的读者一起探讨和进步。
689 7
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
513 1
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
987 0
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
597 0
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
504 7
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
420 0