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

写在前面

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

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

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

640?wx_fmt=png

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

640?wx_fmt=png

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

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

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

640?wx_fmt=png

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

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

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

640?wx_fmt=png

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

640?wx_fmt=png

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

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

640?wx_fmt=png

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

    Install-Package MongoDB.Bson -Version 2.7.0Install-Package MongoDB.Driver -Version 2.7.0
    Install-Package SixLabors.ImageSharp -Version 1.0.0-beta0004Install-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;//数据为nullreturn 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操作软件显示有点问题,将就将就吧!

      640?wx_fmt=png

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

    640?wx_fmt=png

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

640?wx_fmt=png

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

    640?wx_fmt=png

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

    640?wx_fmt=png

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

    640?wx_fmt=png

总结

教程已经写完了,细心地朋友应该能够看到,大部分代码都是昨天晚上写的,今天晚上又稍加修改完成的!一篇文章足足消耗了两个晚上,希望大家能多多支持!
总结中说了一句废话!莫怪啊!本篇文章首先介绍了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实现服务发现以及故障的邮件发送等等功能就不在此项目代码中应用了!

原文地址:https://www.cnblogs.com/yilezhu/p/9297009.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

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

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

相关文章

FFT算法学习笔记

写在前边 1.辣鸡RRRR_wys之前csdn的博客&#xff0c;千年不更。。。还很水。。。于是开了这个Blog。。。妄图拯救一下自己 2.最近接触了一些多项式理论。于是翘掉了愉快的高频自控&#xff0c;通过《算导》稍稍学习了一下 3.算法竞赛中&#xff0c;FFT主要解决多项式的乘法等问…

YbtOJ#20060-[NOIP2020模拟赛B组Day3]字串修改【模拟】

正题 题目链接:http://noip.ybtoj.com.cn/contest/86/problem/2 题目大意 给两个字符串&#xff0c;第一个中的∗*∗号可以替换为若干个&#xff08;可以为0个&#xff09;相同的它的前一个字符。求能否构成第二个字符串。 解题思路 把所有的∗*∗号去掉然后在有的∗*∗号的…

【并查集】家谱(luogu 2814/ssl 2343)

家谱 luogu 2814 ssl 2343 题目大意&#xff1a; 给一堆父子关系&#xff0c;求出一些人的最大的祖先 原题&#xff1a; 题目背景 现代的人对于本家族血统越来越感兴趣。 题目描述 给出充足的父子关系&#xff0c;请你编写程序找到某个人的最早的祖先。 输入输出格式…

System.IO.Pipelines: .NET高性能IO

本文翻译自dotnet团队博客文章&#xff1a;https://blogs.msdn.microsoft.com/dotnet/2018/07/09/system-io-pipelines-high-performance-io-in-net/ System.IO.Pipelines是一个新的库&#xff0c;旨在简化在.NET中执行高性能IO的过程。它是一个依赖.NET Standard的库&#xff…

Full_of_Boys训练1总结

题目来源&#xff1a; 2017-2018 ACM-ICPC Northern Eurasia (Northeastern European Regional) Contest (NEERC 17) A. Archery Tournament 每次查询&#xff0c;找这个位置前面的15个圆&#xff0c;后边15个圆来更新答案。set维护一下圆就行。为什么对&#xff0c;官方题解&a…

CF311B-Cats Transport【斜率优化dp】

正题 题目链接:https://www.luogu.com.cn/problem/CF311B 题目大意 nnn座山在一条线上&#xff0c;有mmm只猫&#xff0c;第iii只从tit_iti​开始在第xix_ixi​座山上游玩结束。 派ppp个人在不同时间从111走到nnn接走所有游玩结束的猫&#xff0c;求所有猫的最小等待时间。 解…

【并查集】黑魔法师之门(codevs 1995/joyoi-codevs 1995)

黑魔法师之门 codevs 1995 joyoi-codevs 1995 题目大意&#xff1a; 有一堆点&#xff0c;每一次操作添加一条边&#xff0c;并要输出每个点的度数都大于1并为偶数的子图的个数 原题&#xff1a; 题目描述 经过了16个工作日的紧张忙碌&#xff0c;未来的人类终于收集到了…

.NET+PostgreSQL实践与避坑指南

简介.NETPostgreSQL(简称PG)这个组合我已经用了蛮长的一段时间&#xff0c;感觉还是挺不错的。不过大多数人说起.NET平台&#xff0c;还是会想起跟它“原汁原味”配套的Microsoft SQL Server(简称MSSQL)&#xff0c;其实没有MSSQL也没有任何问题&#xff0c;甚至没有Windows Se…

Full_of_Boys训练2总结

题目来源:&#xff1a;西安电子科技大学第16届程序设计竞赛网络同步赛 A, B, C: easy problem D. 另一个另一个简单题 做法是加起来&#xff0c;除n。希望会推导的聚聚指点。 #include <bits/stdc.h> const int inf 0x3f3f3f3f; using namespace std; int T; int ans; in…

P2714-四元组统计【数论,容斥】

正题 题目链接:https://www.luogu.com.cn/problem/P2714 题目大意 给出nnn个数&#xff0c;求有多少个(i,j,k,l)(i,j,k,l)(i,j,k,l)使得gcd(ai,aj,ak,al)1gcd(a_i,a_j,a_k,a_l)1gcd(ai​,aj​,ak​,al​)1。 解题思路 我们设fif_ifi​表示gcdgcdgcd和为iii的方案数。FiF_iFi…

【并查集】Supermarket(poj 1456/luogu-UVA1316)

Supermarket poj 1456 luogu-UVA1316 题目大意&#xff1a; 有一堆物品&#xff0c;每一件物品都有自己的价值和保质期&#xff0c;每天只能卖出一件物品&#xff0c;问最大价值是多少 原题&#xff1a; 题目描述 有一个商店有许多批货&#xff0c;每一批货又有N(0<N…

Jimu : .Net Core 分布式微服务框架介绍

一、前言近些年一直浸淫在 .Net 平台做企业应用开发&#xff0c;用过的 .Net 框架不多&#xff08;具体数量不清&#xff0c;印象深刻的有 Asp.Net MVC&#xff0c;WPF&#xff0c;其他很多都是基于微软开发的框架做些封装而形成新的框架&#xff0c;大都是还没起好名就湮灭在历…

组合数学学习笔记

常见组合计数 n球m盒分配问题 球有别&#xff0c;盒子有别&#xff0c;盒子可空&#xff1a;m^n 每个同学都有m种选择 球无别&#xff0c;盒子有别&#xff0c;盒子不可空&#xff1a;C(n-1,m-1) 隔板法 球无别&#xff0c;盒子有别&#xff0c;盒子可空&#xff1a;C(nm-1,m-1…

P3287-[SCOI2014]方伯伯的玉米田【二维树状数组,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3287 题目大意 nnn个玉米高度不同&#xff0c;可以选择kkk个区间拔高111个高度&#xff0c;求最长不降子序列长度。 解题思路 显然每次拔高都是拔一个后缀&#xff0c;所以我们设fi,jf_{i,j}fi,j​表示到第iii个玉米&#x…

【背包】买装备

买装备 题目大意&#xff1a; 有n件物品&#xff0c;每件物品有它的物抗&#xff0c;魔抗&#xff0c;价格&#xff0c;现在要在物抗魔抗各不小于一个值的前提下&#xff0c;使价格最小&#xff08;每件物品只能买一件&#xff09; 原题&#xff1a; 题目描述 mxy 沉迷于一…

.NetCore2.1 WebAPI 根据swagger.json自动生成客户端代码

前言上一篇博客中我们可以得知通过Swagger插件可以很方便的提供给接口开发者在线调试&#xff0c;但是实际上Swagger附带的功能还有很多&#xff0c;比如使用NSwag生成客户端调用代码&#xff0c;进一步解放接口开发者。NSwag NSwag是一个发布在GitHub上的开源项目&#xff0c;…

BZOJ1485: [HNOI2009]有趣的数列

题解&#xff1a;考虑按顺序从小到大&#xff0c;加入数字&#xff0c;将加入奇数位置看作入栈&#xff0c;加入偶数位置看作出栈。为什么可以&#xff1f;考虑我们要保证相邻奇数小于偶数&#xff0c;所以必须先填上一个奇数的位置才能填偶数的位置&#xff0c;既时刻保证奇数…

jzoj4223-旅游【并查集】

正题 题目大意 nnn个点mmm条边&#xff0c;qqq次询问走边权小于xxx的能联通的点对数。 解题思路 将边权排序&#xff0c;然后并查集预处理答案即可。 时间复杂度O(mlog⁡m)O(m\log m)O(mlogm) codecodecode #include<cstdio> #include<cstring> #include<alg…

【dfs】买门票

买门票 题目大意&#xff1a; 给出一些字母&#xff0c;求出可组合成的组合&#xff08;要按顺序&#xff0c;和一定的规则&#xff09; 原题&#xff1a; 题目描述 mxy 正要经过新世界的大门。 现在有很多人在门口排队&#xff0c;每个人将会被发到一个有效的通行密码作为…

HDU1812 - Count the Tetris

polya自主ac的第一道&#xff0c;讨论方法&#xff1a;先把奇偶分开(1)顺时针0度&#xff0c;90度&#xff0c;180度&#xff0c;270度 (2)镜像竖线&#xff0c;水平线&#xff0c;两条对角线。分别推出公式计算&#xff0c;实在推不出来&#xff0c;写个模拟暴力找循环节&…