关于.net core API 图片上传与加载 文件夹

[TOC]

1.上传图片

1.配置Swagger 与文件夹、接口添加
1.建立.net core api 项目 下载 NuGet 包 Swashbuckle.AspNetCore
2.进入 starup 中 ConfigureServices 配置 ,添加如下代码
3.点击项目右键属性->生成->XML 文档文件 ✔ 上,接着在取消显示警告添加1591->保存
            services.AddSwaggerGen(s =>{s.SwaggerDoc("v1", new Info{Title = "图片上传",Description = "图片上传测试",Version = "v1"});#region XML备注var basePath = Path.GetDirectoryName(AppContext.BaseDirectory);var imagePath = Path.Combine(basePath, "ImageDemo.xml");s.IncludeXmlComments(imagePath,true);#endregion});
4.进入 starup 中 Configure 配置 ,添加如下代码
app.UseSwagger();
app.UseSwaggerUI(s => s.SwaggerEndpoint("/swagger/v1/swagger.json", "v1版本"));
5.点击 Properties 编辑为下面
{/*"$schema": "http://json.schemastore.org/launchsettings.json","iisSettings": {"windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": {"applicationUrl": "http://localhost:59623","sslPort": 44385}},*/"profiles": {/*"IIS Express": {"commandName": "IISExpress","launchBrowser": true,"launchUrl": "api/values","environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Development"}},*/"ImageDemo": {"commandName": "Project","launchBrowser": true,"launchUrl": "swagger","applicationUrl": "https://localhost:5001;http://localhost:5000","environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Development"}}}
}
6.运行项目,便可以看到结果,以上 Swagger 配置完毕
2.编写接口
  1. 添加三个文件夹

    • Images 存储图片

      • 里面在设置一个名称为 6 的文件夹
    • IRepositories 接口文件夹
      • 新建接口类 IImagesResource
    • Repositories 实现类文件夹
      • 新建实现类 ImagesResource
  2. 实现类代码

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;namespace ImageDemo.IRepositories
{public interface IImagesResource{/// <summary>/// 加载图片/// </summary>/// <param name="path">路径</param>/// <param name="name">图片名</param>/// <returns></returns>FileContentResult LoadingPhoto(string path, string name);/// <summary>/// 上传图片/// </summary>/// <param name="formFile">图片</param>/// <param name="path">路径</param>/// <param name="name">图片名字</param>/// <returns></returns>CustomStatusCode UpLoadPhoto(IFormFile formFile, string path);}
}

2.实现图片上传

先上代码
实现类总代码

using System;
using System.IO;
using System.Linq;
using ImageDemo.IRepositories;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;namespace ImageDemo.Repositories
{public class ImagesResource:ControllerBase,IImagesResource{public static string[] LimitPictureType = {".PNG", ".JPG", ".JPEG", ".BMP", ".ICO"};/// <summary>/// 加载图片/// </summary>/// <param name="path"></param>/// <param name="name"></param>/// <returns></returns>public FileContentResult LoadingPhoto(string path, string name){path = Directory.GetCurrentDirectory() + path + name + ".jpeg";FileInfo fi=new FileInfo(path);if (!fi.Exists){return null;}FileStream fs = fi.OpenRead();byte[] buffer=new byte[fi.Length];//读取图片字节流//从流中读取一个字节块,并在给定的缓冲区中写入数据。fs.Read(buffer, 0, Convert.ToInt32(fi.Length));var resource = File(buffer, "image/jpeg");fs.Close();return resource;}/// <summary>/// 上传图片/// </summary>/// <param name="formFile"></param>/// <param name="path">路劲</param>/// <returns></returns>public CustomStatusCode UpLoadPhoto(IFormFile formFile, string path){CustomStatusCode code;var currentPictureWithoutExtension = Path.GetFileNameWithoutExtension(formFile.FileName);var currentPictureExtension = Path.GetExtension(formFile.FileName).ToUpper();path = Directory.GetCurrentDirectory() + path;if (LimitPictureType.Contains(currentPictureExtension)){if (!Directory.Exists(path)){Directory.CreateDirectory(path);}string name = currentPictureWithoutExtension + ".jpeg";path += name;using (var fs=System.IO.File.Create(path)){formFile.CopyTo(fs);//Stream 都有 Flush() 方法,//根据官方文档的说法//“使用此方法将所有信息从基础缓冲区移动到其目标或清除缓冲区,或者同时执行这两种操作”fs.Flush();}code = new CustomStatusCode{Status = "200",Message = $"图片 {name} 上传成功"};return code;}code = new CustomStatusCode{Status = "400",Message = $"图片上传失败,格式错误"};return code;}}
}

上面有个重点是实现类还继承了 ControllerBase,并且继承位置要在IImagesResource之前
其中 CustomStatusCode 类是信息返回类下面贴下

namespace ImageDemo
{public class CustomStatusCode{public object Status;public object Message { get; set; }public object Data { get; set; }}
}

取出里面的上传图片代码

        /// <summary>/// 上传图片/// </summary>/// <param name="formFile">图片</param>/// <param name="path">路劲</param>/// <returns></returns>public CustomStatusCode UpLoadPhoto(IFormFile formFile, string path){CustomStatusCode code;var currentPictureWithoutExtension = Path.GetFileNameWithoutExtension(formFile.FileName);var currentPictureExtension = Path.GetExtension(formFile.FileName).ToUpper();path = Directory.GetCurrentDirectory() + path;if (LimitPictureType.Contains(currentPictureExtension)){if (!Directory.Exists(path)){Directory.CreateDirectory(path);}string name = currentPictureWithoutExtension + ".jpeg";path += name;using (var fs=System.IO.File.Create(path)){formFile.CopyTo(fs);//Stream 都有 Flush() 方法,//根据官方文档的说法//“使用此方法将所有信息从基础缓冲区移动到其目标或清除缓冲区,或者同时执行这两种操作”fs.Flush();}code = new CustomStatusCode{Status = "200",Message = $"图片 {name} 上传成功"};return code;}code = new CustomStatusCode{Status = "400",Message = $"图片上传失败,格式错误"};return code;}

解释阶段

  1. IFormFile

    • 是上传的文件
  2. var currentPictureWithoutExtension = Path.GetFileNameWithoutExtension(formFile.FileName);
    • 获取没有后缀扩展名的文件名,如传过来的是 image.png,经过上面 currentPictureWithoutExtension = image
  3. var currentPictureExtension = Path.GetExtension(formFile.FileName).ToUpper();
    • 得到 formFile 的扩展名并将其
  4. path = Directory.GetCurrentDirectory() + path;
    • Directory.GetCurrentDirectory()得到当前程序的路劲,也就是和 Starup.cs 文件同等级的存在
  5. string name = currentPictureWithoutExtension + “.jpeg”;
    • 这段代码是为了保存图片将后缀名统一,因为提取图片需要后缀名,以后提取图片方便点,这是个很次的写法,当时没想到其他的方法,这个方法不怎么可取后面我会改,先留个坑
  6. fs.Flush();
    • 这个解释是看网上的说明
    • Stream 都有 Flush() 方法,根据官方文档的说法“使用此方法将所有信息从基础缓冲区移动到其目标或清除缓冲区,或者同时执行这两种操作”

3.加载图片

贴代码

        /// <summary>/// 加载图片/// </summary>/// <param name="path"></param>/// <param name="name"></param>/// <returns></returns>public FileContentResult LoadingPhoto(string path, string name){path = Directory.GetCurrentDirectory() + path + name + ".jpeg";FileInfo fi=new FileInfo(path);if (!fi.Exists){return null;}FileStream fs = fi.OpenRead();byte[] buffer=new byte[fi.Length];//读取图片字节流//从流中读取一个字节块,并在给定的缓冲区中写入数据。fs.Read(buffer, 0, Convert.ToInt32(fi.Length));var resource = File(buffer, "image/jpeg");fs.Close();return resource;}
  1. File(buffer, “image/jpeg”)

    • 这个方法继承自 ControllerBase 并不是来自 using System.IO 中
    • 至于怎样用 using System.IO; 把图片取出来…我还没学,望大佬教教

4.Controller 控制器

贴代码

using ImageDemo.Db;
using ImageDemo.IRepositories;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System.Collections.Generic;
using System.IO;

namespace ImageDemo.Controllers
{
[Route(“api/[controller]”)]
[ApiController]
public class ValuesController : ControllerBase
{
#region Inistial

    private readonly DbContext _dbContext;private readonly IImagesResource _imagesResource;private readonly ILogger<ValuesController> _logger;public ValuesController(ILogger<ValuesController> logger,DbContext dbContext,IImagesResource imagesResource){_logger = logger;_dbContext = dbContext;_imagesResource = imagesResource;}#endregion/// <summary>/// 批量上传图片/// </summary>/// <param name="file"></param>/// <param name="formCollection"></param>[HttpPost]public IActionResult Post([FromForm] IFormFileCollection formCollection){IList<CustomStatusCode> code=new List<CustomStatusCode>();if (formCollection.Count > 0)foreach (IFormFile file in formCollection){var currentCode=_imagesResource.UpLoadPhoto(file, @"\images\6\");code.Add(currentCode);}return StatusCode(200,code);}/// <summary>/// 获取图片/// </summary>/// <param name="imgName"></param>/// <returns></returns>[HttpGet]public IActionResult Get(string imgName){var image = _imagesResource.LoadingPhoto("\\Images\\6\\", imgName);if (image == null){_logger.LogInformation($"图片 {imgName} 不存在");var code = new CustomStatusCode{Status = "404",Message = $"图片 {imgName} 加载不存在"};return StatusCode(404, code);}return image;#region MyRegion/*string[] LimitPictureType ={".PNG", ".JPG", ".JPEG", ".BMP", ".GIF", ".ICO"};GetFileName(di);string path = Directory.GetCurrentDirectory()+ $@"\Images\6\{imgName}"+".jpeg";FileInfo fi = new FileInfo(path);FileStream fs = fi.OpenRead(); ;byte[] buffer = new byte[fi.Length];//读取图片字节流fs.Read(buffer, 0, Convert.ToInt32(fi.Length));var response = File(buffer, "image/jpeg");fs.Close();return response;*/#endregion}private static IList<string> path = new List<string>(); //保存你图片名称DirectoryInfo di = new DirectoryInfo(Directory.GetCurrentDirectory()+@"\Images\6\");/// <summary>/// 加载目录内文件夹名/// </summary>/// <param name="info"></param>public static void GetFileName(DirectoryInfo info){//获取该路径下的所有文件的列表FileInfo[] fileInfo = info.GetFiles();//开始得到图片名称foreach (FileInfo subinfo in fileInfo){//判断扩展名是否相同// if (subinfo.Extension == extension)// {string strname = subinfo.Name; //获取文件名称path.Add(strname); //把文件名称保存在泛型集合中// }}}
}

}


5.想法,问题与 GitHub

问题:

  1. 上传图片可以多张上传,加载图片的方法本来也想多张加载,当时多张的话,图片就会变成字符串的形式,不知为何,求解
  2. 如果不用 ControllerBse 中的 File 那么该如何向页面传递图片

有两个想法,朋友提的:

  1. 那个加载图片直接建立一个html网页,将图片放进去,前端这样可以访问图片,应该可行,不知效率怎样
  2. 那个改后缀的实属下策,可以用建立数据库,两列,一列存储图片名,一列存储图片后缀,存储的时候可以将图片的名字改下,如果是用户头像,可以改为用户 Id 这样数字就唯一了

.net core api 图片上传与加载相关推荐

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

    图片或者文件上传相信大家在开发中应该都会用到吧,有的时候还要对图片生成缩略图.那么如何在Asp.Net Core Web Api实现图片上传存储以及生成缩略图呢?今天我就使用MongoDB作为图片存储 ...

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

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

  3. 微信JSSDK多图片上传并且解决IOS系统上传一直加载的问题

    微信JSSDK多图片上传并且解决IOS系统上传一直加载的问题 参考文章: (1)微信JSSDK多图片上传并且解决IOS系统上传一直加载的问题 (2)https://www.cnblogs.com/co ...

  4. .net core 7图片上传到数据库和浏览

    项目场景: .net core 7 图片上传 本来以为前面有asp的理解这块应该不成问题,但还是花费了两天时间,期间看了下官方的文档(官方文档core上传)才解决 1.这是我的模型 2.控制器 pub ...

  5. Scratch上传作品加载之分析(封面获取),base64转blob 前后端方案,前端 后端 解析base64为Blob,2021年较底层进行sb3作品渲染

    采坑的初衷: 考虑到作品的私有性.用户上传的作品必须是私有的,当且仅当用户设置作品公开 (理论上得提交给管理员,进行审核,管理员进行操作).那么才能够通过projectHost的方式去请求. 也就是说 ...

  6. Asp Net Core普通图片上传

    文件上传 一.控制器 二.Model 1.类 2.视图 总结 一.控制器 [HttpPost]public IActionResult Edit(StudentEditViewModel model) ...

  7. uploadify使用中遇到flash文件上传按钮加载不出来

    一.upload的下载使用 1.下载地址:http://www.uploadify.com  2.导入flash版本 <link rel="stylesheet" type= ...

  8. chrome上 flash上传插件加载失败的 解决方法

    设置浏览器运行flash 1.打开设置 2.进入高级 3.进入内容设置 4.进入flash设置 5.设置允许运行 转载于:https://my.oschina.net/u/3507508/blog/1 ...

  9. 商城项目笔记一:搭建Maven工程,利用Dubbo实现SOA面向服务框架,部署zookeeper注册中心,FastDFS框架实现图片上传,部署nginx服务器。

    文章目录 1. 商城项目总结笔记: 1.1. 第一天工作记录:搭建Maven工程 1.2. 第二天工作记录:创建SOA面向服务架构,通过工具类实现分页技术 1.3. 第三天工作记录:部署nginx服务 ...

最新文章

  1. 写给小白看的线程和进程,高手勿入
  2. windows server系统,登录系统提示按下 ctrl+alt+delete
  3. KEIL与ADS1.2共存
  4. 企业网站前端制作实战教程 JQuery CSS JS HTML 登录表单验证
  5. [iOS]自定义view使用xib
  6. powerdesigner导入sql生成pdm没有注释_PDM手写签名实现方法
  7. Android-传感器开发
  8. rsyslog及loganalyzer
  9. bzoj 1926: [Sdoi2010]粟粟的书架 (主席树+二分)
  10. 甩一个Microsoft office visio 2013的百度云连接
  11. Qt开发经验小技巧196-200
  12. 查找网络上的计算机快捷键,电脑表格查找快捷键ctrl加什么(表格快捷键各种用法大全)...
  13. 小象大数据全套视频教程
  14. BT 运行及内网穿透原理
  15. v-if与v-show(动态显示dom元素)
  16. OpenStack 虚拟机冷/热迁移的实现原理与代码分析
  17. elasticsearch搭建与java应用实例
  18. Kubernetes 三大探针及探针方式
  19. 房天下APP竞品分析
  20. 巴比特 | 元宇宙每日必读:未成年人打赏后要求退款,虚拟主播称自己是大冤种,怎么看待这个监管漏洞?...

热门文章

  1. 前进刷新后退缓存及第一次缓存无效
  2. 区块链角色对战游戏nft游戏开发
  3. Android游戏开发–雪碧动画
  4. 想成为物联网领域的小米 你必须要看的10个原则
  5. mac不识别外置硬盘如何解决
  6. 华为手机是否更新为鸿蒙系统,华为鸿蒙OS即将迎来升级 手机端操作系统或还要更久...
  7. 这三款充电宝让你出门无需带充电线,最后一款太方便!
  8. Ubuntu使用Gparted调整分区大小—进入图形界面前一直停留在debian界面
  9. nginx启动命令和停止命令
  10. java calendar格式化_Java:日期时间转换与格式化