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

时间:2022-10-26 19:40:34

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 。如下图所示:

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

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

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

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

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

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

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

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

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

Asp.Net Core Web Api图片上传(一)集成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后面的路径里面的配置文件里的配置进行启动。

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

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

你可以重新设置参数后,然后重新启动服务即可生效!

最后,让我们浏览器打开上面设置的IP以及端口号查看一下,如下图所示,表示MongoDB安装成功!

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

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

  1. 新建Asp.Net Core Web Api项目

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

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

  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操作软件显示有点问题,将就将就吧!

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

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

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

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

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

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

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

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

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

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

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

示例代码

[点我下载][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实现服务发现以及故障的邮件发送等等功能就不在此项目代码中应用了!

Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程的更多相关文章

  1. Web Api 图片上传,在使用 Task&period;ContinueWith 变量无法赋值问题

    细谈 Web Api 图片上传,在使用 Task.ContinueWith 变量无法赋值问题的解决办法!   在使用Asp.Net Web Api 图片上传接口的时候,到网上找了一些个例子,但大多数找 ...

  2. 细谈 Web Api 图片上传,在使用 Task&period;ContinueWith 变量无法赋值问题的解决办法!

    在使用Asp.Net Web Api 图片上传接口的时候,到网上找了一些个例子,但大多数找到都是这个版本! [HttpPost] public Task<Hashtable> ImgUpl ...

  3. Asp&period;Net Web Api 图片上传

    public string UploadFile()        {            if (Request.Content.IsMimeMultipartContent())         ...

  4. Docker容器环境下ASP&period;NET Core Web API应用程序的调试

    本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...

  5. Docker容器环境下ASP&period;NET Core Web API

    Docker容器环境下ASP.NET Core Web API应用程序的调试 本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Dock ...

  6. ASP&period;NET Core Web API下事件驱动型架构的实现(一):一个简单的实现

    很长一段时间以来,我都在思考如何在ASP.NET Core的框架下,实现一套完整的事件驱动型架构.这个问题看上去有点大,其实主要目标是为了实现一个基于ASP.NET Core的微服务,它能够非常简单地 ...

  7. ASP&period;NET Core WEB API 使用element-ui文件上传组件el-upload执行手动文件文件,并在文件上传后清空文件

    前言: 从开始学习Vue到使用element-ui-admin已经有将近快两年的时间了,在之前的开发中使用element-ui上传组件el-upload都是直接使用文件选取后立即选择上传,今天刚好做了 ...

  8. 用VSCode开发一个asp&period;net core2&period;0&plus;angular5项目&lpar;5&rpar;&colon; Angular5&plus;asp&period;net core 2&period;0 web api文件上传

    第一部分: http://www.cnblogs.com/cgzl/p/8478993.html 第二部分: http://www.cnblogs.com/cgzl/p/8481825.html 第三 ...

  9. 在ASP&period;NET Core Web API上使用Swagger提供API文档

    我在开发自己的博客系统(http://daxnet.me)时,给自己的RESTful服务增加了基于Swagger的API文档功能.当设置IISExpress的默认启动路由到Swagger的API文档页 ...

随机推荐

  1. sprint3与总结

    backlog-看板-燃尽图-每日立会 github:https://github.com/alfredzhu/team-work 总结:这种团队合作的方式很好,大家在一起沟通,相互交流想法,一起解决 ...

  2. Servlet基础简单总结&lpar;上&rpar;

    Servlet基础一些简单总结(上): 1.Java Servlet是运行在Web服务器上的Java程序2.Java平台给Servlet开发者提供了强大的API/面向对象编程平台无关/强类型/垃圾回收 ...

  3. nyoj-291 互素数个数 欧拉函数

    LK的数学题 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 LK最近遇到一个问题,需要你帮她一下.一个整数n,求[1,n)中,和n互素的数的个数.   输入 多组测 ...

  4. 细雨学习笔记:Jmeter测试计划最基本的元素

    测试计划-用户组下最基本的元素: 1)HTTP请求默认值 2)HTTP Cookie 管理器(有些操作需要登录后才能访问,用户信息记录在Cookie中,各请求之间就可以共享Cookie了) 3)请求S ...

  5. GDB 的MI接口

    背景介绍: libgdb过时了,目前的GDB调试前端都不用libgdb 目前有两种比较流行:- MI接口,现在应该是MI II接口,是Eclipse CDT所采用的方式- emac输出接口,这个似乎有 ...

  6. 遇到的Fragment中使用setAdapter&lpar;&rpar;设置ListView报空指针解决方案

    场景是这样,底部4个tab导航栏.用的fragment. 但其中一个fragmentActivity1中使用ListVIew的setAdapter()方法时,总是报NullPointerExcepti ...

  7. Android开发(21)--有关Spinner控件的使用说明

    下拉列表 Spinner,Spinner是一个每次只能选择所有项的一个项的控件.它的项来自于与之相关联的适配器中. Spinner的使用,可以极大提高用户的体验性.当需要用户选择的时候,可以提供一个下 ...

  8. 新装云服务器没有iptables 文件,并且无法通过service iptables save操作

    在安装zookeeper时,需要放开端口2181 按照视频教程在 /etc/sysconfig/ 下对iptables 文件进行编辑,但是该目录下没有此文件 通过强行写iptables -P  OUT ...

  9. JEECG框架中使用Flash版本Uploadify,在Chrome版本号70下无法启动的解决办法

    感谢文章:https://www.cnblogs.com/zinan/p/6902427.html 单独打开IFRAME中的页面 点击导航栏的<不安全> 再刷新单独IFRAME的页面,就可 ...

  10. 虚拟机下 centos7 无法连接网络

    [root@localhost ~]# cd /etc/sysconfig/network-scripts [root@localhost network-scripts]# ls ifcfg-ens ...