ASP.NET Core基础之图片文件(一)-WebApi图片文件上传到文件夹
阅读本文你的收获:
- 了解WebApi项目保存上传图片的三种方式
- 学习在WebApi项目中如何上传图片到指定文件夹中
在ASP.NET Core基础之图片文件(一)-WebApi访问静态图片文章中,学习了如何获取WebApi中的静态图片,本文继续分享如何上传图片。
那么,上传的图片应该存放到什么位置?
在ASP.NET Core Web API中,通常将上传的图片存储在以下目录之一:
- 【方案1】系统中的特定文件夹:比如创建一个Uploads文件夹,并将其配置为应用程序的静态文件目录。这样就可以将上传的图片保存在该文件夹中。
- 【方案2】数据库:可以将上传的图片存储在数据库中。
- 【方案3】云存储服务:如果想将图片存储在远程服务器上,可以使用云存储服务(如阿里云OSS、七牛云、Microsoft Azure Blob Storage等)来存储上传的图片。也可以搭建自己的私有云存储服务器。
以上三种方案需要根据具体的需要进行选择,以下案例演示的是【方案1】,即上传到应用系统服务器的特定文件夹下面。
开发环境:
操作系统: Windows 10 专业版
平台版本是:.NET 6
开发框架:ASP.NET Core WebApi
开发工具:Visual Studio 2022
一. 创建并配置上传图片的文件夹
- 在WebApi项目上右击,新建文件夹“Uploads”
- 在Program.cs中配置静态文件中间件
采用自定义配置StaticFileOptions,把文件存放到Uploads文件夹中。
//引用命名空间
using Microsoft.Extensions.FileProviders;app.UseStaticFiles(new StaticFileOptions{//例如保存到网站根目录 {content root}/Files下面,可以用Path.Combine方法拼接路径FileProvider = new PhysicalFileProvider(Path.Combine(app.Environment.ContentRootPath, "Uploads")),RequestPath = "/uploads" //配置请求路径});
二.编写上传图片的WebApi接口
- 在控制器类的上面,引用以下命名空间
using System.IO; //文件操作
using Microsoft.AspNetCore.Hosting; //ASPNET Core的托管环境
- 控制器类里面写一个上传文件的api接口
/// <summary>/// 产品模块(演示文件上传)/// </summary>[Route("api/[controller]/[action]")][ApiController]public class ProductController : ControllerBase{/// <summary>/// 图片上传/// </summary>/// <param name="file"></param>/// <returns></returns>[HttpPost]public IActionResult UploadFile(IFormFile file, //文件对象[FromServices] IWebHostEnvironment env) //局部注入主机环境对象{//检查文件大小if (file.Length == 0){return BadRequest(new { Code = 1001, Msg = "未上传文件" });}//获取文件的MIME类型var mimeType = file.ContentType;// 定义一些常见的图片MIME类型 var imageMimeTypes = new List<string>{"image/jpeg","image/png","image/gif" // 可以根据需要添加其他图片MIME类型//,"image/bmp"//,"image/tiff"//,"image/webp" };// 检查文件的MIME类型是否在图片MIME类型列表中 if (!imageMimeTypes.Contains(mimeType)){return BadRequest(new { Code = 1002, Msg = "上传的文件不是图片" });}//拼接上传的文件路径string fileExt = Path.GetExtension(file.FileName); //获取文件扩展名string fileName = Guid.NewGuid().ToString("N") + fileExt; //生成全球唯一文件名string relPath = Path.Combine(@"\uploads", fileName); //拼接相对路径string fullPath = Path.Combine(env.ContentRootPath, "Uploads", fileName); //拼接绝对路径//创建文件using (FileStream fs = new FileStream(fullPath, FileMode.Create)){file.CopyTo(fs); //把上传的文件file拷贝到fs里fs.Flush(); //刷新fs文件缓存区};//返回上传后的 相对路径return Ok(new { Data = relPath.Replace("\\", "/"), Code = 2001, Msg = "上传图片成功" });}}
- 用Swagger测试一下以上接口,并在VS里面打断点调试,看每一步的变化
三. 浏览器里面测试能否查看图片URL
在浏览器中访问上传的图片路径
四.VUE前端页面实现上传功能(含信息提交功能)
-
MVC视图中写一个添加页面Create.cshtml,引入vue和axios两个js
<script src="~/lib/axios.js"></script> <script src="~/lib/vue.js"></script>
-
在Create.cshtml上继续创建div模板
<div id="app"><form><div><label>产品标题:</label><input type="text" v-model="formModel.title" /></div><div><label>产品图片:</label><input type="file" v-on:change="handleFileChange" /></div><input type="button" v-on:click="add" value="添加" /><input type="reset" value="重置" /></form> </div>
-
在Create.cshtml上的< script >标签中创建Vue的实例
需要在methods中,实现以上div中 绑定的change事件方法 handleFileChange和add方法
需要在data中定义以上< form >标签中,v-model所绑定的字段formModel.XXXX<script> var vm = new Vue({el: '#app',data: { files: [], //文件列表formModel: { //表单模型(重要:里面的字段名称和数据库表的名称必须一致)title: '',filePath: '', //上传之后添加的相对路径}},methods: { //实现文件上传,并接口返回的图片路径handleFileChange(e) {//1.调试输出//console.log("handleFileChange方法进来了")//console.log(e.target.files);//2. e.target.files赋值给data里定义的files数组this.files = e.target.files;//生成post请求所需要的data数据var fdata = new FormData();fdata.append("file", this.files[0]);//调用API接口,上传图片axios({url: 'https://localhost:5001/api/Product/UploadFile',//api接口地址method: 'POST',data: fdata}).then((res) => { //api调用成功之后的回调函数//调试一下是否拿到了数据console.log(res.data);if (res.data.code == 2001 ) {//上传成功,则把图片的URL路径保存到formModel里this.formModel.filePath = res.data.data;}});},add() {//调用API接口,进行删除axios({url: 'https://localhost:7186/api/Product/Create', //api接口地址method: 'POST',data: this.formModel}).then((res) => { if (res.data.code == 2001 ) {//跳转location.href = "Index";}});}},mounted() { //挂载事件//在这里可以加载绑定下拉} }); </script>
本文演示了ASP.NET Core WebApi实现单图片上传并保存到系统指定的文件夹。下次我们分享如何把图片保存到云存储服务中。
如果本文对你有帮助的话,请点赞+评论+关注,或者转发给需要的朋友。
相关文章:

ASP.NET Core基础之图片文件(一)-WebApi图片文件上传到文件夹
阅读本文你的收获: 了解WebApi项目保存上传图片的三种方式学习在WebApi项目中如何上传图片到指定文件夹中 在ASP.NET Core基础之图片文件(一)-WebApi访问静态图片文章中,学习了如何获取WebApi中的静态图片,本文继续分享如何上传图片。 那么…...
精准掌控 Git 忽略规则:定制化 .gitignore 指南
🧙♂️ 诸位好,吾乃诸葛妙计,编程界之翘楚,代码之大师。算法如流水,逻辑如棋局。 📜 吾之笔记,内含诸般技术之秘诀。吾欲以此笔记,传授编程之道,助汝解技术难题。 &…...

Harmony 开始支持 Flutter ,聊聊 Harmony 和 Flutter 之间的因果
原创作者:恋猫de小郭 相信大家都已经听说过,明年的 Harmony Next 版本将正式剥离 AOSP 支持 ,基于这个话题我已经做过一期问题汇总 ,当时在 现有 App 如何兼容 Harmony Next 问题上提到过: 华为内部也主导适配目前的主…...

k8s 之7大CNI 网络插件
一、介绍 网络架构是Kubernetes中较为复杂、让很多用户头疼的方面之一。Kubernetes网络模型本身对某些特定的网络功能有一定要求,但在实现方面也具有一定的灵活性。因此,业界已有不少不同的网络方案,来满足特定的环境和要求。 CNI意为容器网络…...

stable diffusion 人物高级提示词(一)头部篇
一、女生发型 prompt描述推荐用法Long hair长发一定不要和 high ponytail 一同使用Short hair短发-Curly hair卷发-Straight hair直发-Ponytail马尾high ponytail 高马尾,一定不要和 long hair一起使用,会冲突Pigtails2条辫子-Braid辫子只写braid也会生…...
限制哪些IP能连接postgre
打开C:\Program Files\PostgreSQL\9.4\data\pg_hba.conf 以下代表本机能连,172.16.73.xx都能连(/24就代表最后一位是0-255),如果是172.16.73.11/32那就是限制了172.16.73.11才能连(实际我设置/32是无效的)&…...

可狱可囚的爬虫系列课程 08:新闻数据爬取实战
前言 本篇文章中我带大家针对前面所学 Requests 和 BeautifulSoup4 进行一个实操检验。 相信大家平时或多或少都有看新闻的习惯,那么我们今天所要爬取的网站便是新闻类型的:中国新闻网,我们先来使用爬虫爬取一些具有明显规则或规律的信息&am…...
mysql2pgsql
使用pgloader进行迁移 pgloader是一个强大的数据迁移工具,专为将不同数据库之间的数据迁移到PostgreSQL而设计。它支持从MySQL到PostgreSQL的迁移,并提供了一种简单且灵活的方式来转移数据。 安装pgloader 使用pgloader迁移数据 1、命令行方式 2、脚…...

设计模式-流接口模式
设计模式专栏 模式介绍模式特点应用场景流接口模式和工厂模式的区别代码示例Java实现流接口模式Python实现流接口模式 流接口模式在spring中的应用 模式介绍 流接口模式是一种面向对象的编程模式,它可以使代码更具可读性和流畅性。流接口模式的核心思想是采用链式调…...
Java 堆与栈的作用与区别
栈是运行时的单位,而堆是存储的单位,栈解决程序的运行问题,堆解决数据存储的问题。 一个线程对应一个线程栈,栈是运行单位,里面存储的信息都是跟当前线程相关的信息,包括局部变量、程序运行状态、方法返回…...
再谈小米汽车
文章目录 1. 外观2. 电机3. 电池4. 风阻5. 强度6. 智能驾驶 我在两年前分析过小米造车的形势,大家可以 点击这里查看。今天小米官宣传了新汽车。看一下它公布的主要信息: 1. 外观 汽车外观是向保时捷致敬,因此它的外观特别像保时捷。不过外…...

Power Apps 学习笔记 - IOrganizationService Interface
文章目录 1. IOrganization Interface1.1 基本介绍1.2 方法分析 2. Entity对象2.1 Constructor2.2 Properties2.3 Methods 3. 相关方法3.1 单行查询 Retrive3.2 多行查询 RetriveMultiple3.3 增加 Create3.4 删除 Delete3.5 修改 Update 4. 数据查询的不同实现方式4.1 QueryExp…...
常见函数的4种类型(js的问题)
• 匿名函数 • 回调函数 • 递归函数 • 构造函数 1、匿名函数 定义时候没有任何变量引用的函数 匿名函数自调:函数只执行一次 (function(a, b){console.log(a b);} )(1, 2);// 等价于 function foo (a, b){console.log(a b); }foo(1, …...

DNS主从服务器、转发(缓存)服务器
一、主从服务器 1、基本含义 DNS辅助服务器是一种容错设计,考虑的是一旦DNS主服务器出现故障或因负载太重无法及时响应客户机请求,辅助服务器将挺身而出为主服务器排忧解难。辅助服务器的区域数据都是从主服务器复制而来,因此辅助服务器的数…...

第二十一章 网络编程
第二十一章 网络编程 1.网络相关概念2.IP地址3.域名与端口4.网络协议5.TCP与UDP6.InetAddress7.Socket8.TCP字节流编程19.TCP字节流编程210.TCP字节流编程311.网络上传文件112.网络上传文件213.网络上传文件314.Netstat15.TCP连接秘密16.UPD原理17.UPD网络编程118.UDP网络编程2…...

scratch新跳7游戏 2023年12月中国电子学会图形化编程 少儿编程 scratch编程等级考试四级真题和答案解析
目录 scratch新跳7游戏 一、题目要求 1、准备工作 2、功能实现 二、案例分析...
三、C#面向对象编程(接口与实现)
在C#中,接口是一种定义方法但不包含实现的方式,可以被多个类实现以支持不同的行为。通过接口,我们可以定义一组标准的成员,让类遵循特定的契约。 下面是一个关于接口和实现的简单示例: // 定义一个接口 public inter…...

【java爬虫】股票数据获取工具前后端代码
前面我们有好多文章都是在介绍股票数据获取工具,这是一个前后端分离项目 后端技术栈:springboot,sqlite,jdbcTemplate,okhttp 前端技术栈:vue,element-plus,echarts,ax…...

Scikit-Learn线性回归(四)
Scikit-Learn线性回归四:梯度下降 1、梯度下降1.1、梯度下降概述1.2、梯度下降及原理1.3、梯度下降的实现2、梯度下降法求解线性回归的最优解2.1、梯度下降法求解的原理2.2、梯度下降法求解线性回归的最优解2.3、梯度下降法求解线性回归案例(波士顿房价预测)3、Scikit-Learn…...

SCT2330C——3.8V-28V输入,3A,低EMI,超低功耗同步降压DCDC转换器
描述: SCT2330C是3A同步buck变换器,输入电压范围高达28V,完全集成了80mΩ高压侧MOSFET和42mΩ低压侧MOSFET,提供高效降压DC-DC转换。SCT2330C采用峰值电流模式控制,集成补偿网络,通过最小化片外元件数量&a…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...

倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...