ASP.NET Core基础之图片文件(二)-WebApi图片文件上传到文件夹

news2024/12/26 2:35:28

阅读本文你的收获:

  1. 了解WebApi项目保存上传图片的三种方式
  2. 学习在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

一. 创建并配置上传图片的文件夹

  1. 在WebApi项目上右击,新建文件夹“Uploads”
    在这里插入图片描述
  2. 在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接口

  1. 在控制器类的上面,引用以下命名空间
using System.IO; //文件操作
using Microsoft.AspNetCore.Hosting; //ASPNET Core的托管环境
  1. 控制器类里面写一个上传文件的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 = "上传图片成功" });
     }
 }
  1. 用Swagger测试一下以上接口,并在VS里面打断点调试,看每一步的变化
    在这里插入图片描述

三. 浏览器里面测试能否查看图片URL

在浏览器中访问上传的图片路径
在这里插入图片描述

四.VUE前端页面实现上传功能(含信息提交功能)

  1. MVC视图中写一个添加页面Create.cshtml,引入vue和axios两个js

    <script src="~/lib/axios.js"></script>
    <script src="~/lib/vue.js"></script>
    
  2. 在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>
    
  3. 在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实现单图片上传并保存到系统指定的文件夹。下次我们分享如何把图片保存到云存储服务中。
如果本文对你有帮助的话,请点赞+评论+关注,或者转发给需要的朋友。

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

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

相关文章

单点测距传感器|激光扫描传感器SPR系列安装方法

单点测距传感器|激光扫描传感器可用于对物体进行非接触式距离测量&#xff0c;其十分广泛的应用于工业自动化、生产线、传送带等工业自动化场景中&#xff0c;也可以使用测距传感器进行物体的距离测量和位置检测、AGV和又车的碰撞保护&#xff0c;机器人工作范围的量程检测&…

C++实现单例模式

单例模式&#xff1a; 一种设计模式&#xff0c;它的目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个实例。它适用于需要全局唯一的对象或资源的情况。 23种设计模式种最简单最常见的一种&#xff08;高频考点&#xff09; 要求&#xff1a;通过一个…

移动通信原理与关键技术学习(3)

1.什么是相干解调&#xff1f;什么是非相干解调&#xff1f;各自的优缺点是什么&#xff1f; 相干解调需要在接收端有一个与发送端一样的载波&#xff08;同样的频率和相位&#xff09;&#xff0c;在接收端的载波与发送端载波进行互相关操作&#xff0c;去除载波的影响。相干…

ssm使用web工程的相关知识

不使用框架创建web的两种方式&#xff08;这里是idea2022.3.2版&#xff09; 第一种&#xff1a;项目右键点击&#xff1a;add Framwork support选择框架进行创建。 操作步骤&#xff1a; 使用这种方式创建可能会存在的问题&#xff1a; 如果你创建web框架前&#xff1a;在…

【Flutter 开发实战】Dart 基础篇:常见的数据类型

Dart 支持许多数据类型&#xff0c;包括我们常见的 Numbers&#xff08;数值类型&#xff09;、Strings&#xff08;字符串类型&#xff09;、Booleans&#xff08;布尔类型&#xff09;&#xff0c;也支持一些包括 Collections&#xff08;集合类型&#xff09;、Records&…

嵌入式项目——平衡小车(1)

焊接 驱动板需要焊接的如上图。 陀螺仪8pin排母电机两路排线插口。(个别同学需要焊接)两个电池仓,注意电池仓分正反。 安装 底部电池板 4个 双通尼龙柱M3*224个 尼龙螺钉M3*6电机驱动板

环境搭建 之 Ubuntu 安装

ubuntu-releases-20.04.6安装包下载_开源镜像站-阿里云ubuntu-releases-20.04.6安装包是阿里云官方提供的开源镜像免费下载服务&#xff0c;每天下载量过亿&#xff0c;阿里巴巴开源镜像站为包含ubuntu-releases-20.04.6安装包的几百个操作系统镜像和依赖包镜像进行免费CDN加速…

Matplotlib for C++不完全手册

matplotlib-cpp是Matplotlib&#xff08;MPL&#xff09;为C提供的一个用于python的matplotlib绘图库的C包装器。它的构建类似于Matlab和matplotlib使用的绘图API。 However, the function signatures might differ and Matplotlib for C does not support the full functional…

【嵌入式】Makefile 学习笔记记录 | 嵌入式Linux

文章目录 前言一、Makefile的引入——最简单的gcc编译过程二、Makefile的规则三、Makefile的语法3.1、通配符3.2、假想目标 .phony3.3、即时变量 延时变量 四、Makefile的函数4.1、foreach4.2、filter4.3、wildcard4.4、patsubst 五、Makefile升级5.1、包含头文件在内的依赖关系…

商品期货交易中的强行平仓:交易所的规定和风险控制

在商品期货交易中&#xff0c;保证金充足的情况下&#xff0c;一般不会被强行平仓。然而&#xff0c;有几种情况可能会导致强行平仓的发生&#xff1a; 1 持仓超过交易所限仓规定&#xff1a;交易所会设定限仓规定&#xff0c;限制每位投资者的持仓数量。如果超过限仓规定&…

如何使用 CMake 来构建一个共享库(动态库)

tutorial_4/CMakeLists.txt # 声明要求的 cmake 最低版本 cmake_minimum_required( VERSION 2.8 )# 声明一个 cmake 工程 project( HelloSLAM )add_subdirectory(src)tutorial_4/src/CMakeLists.txt #工程添加多个特定的头文件搜索路径 include_directories(include)set(LIBR…

静态路由、代理ARP

目录 静态路由静态路由指明下一跳和指明端口的区别代理ARP 我们知道&#xff0c;跨网络通信需要路由 路由有三种类型&#xff1a; 1.直连路由。 自动产生的路由&#xff0c;当网络设备连接到同一网络时&#xff0c;他们可以自动学习到对方的存在。自动学习相邻网络设备的直连信…

python编程从入门到实践(3+4)操作列表+if语句

文章目录 第四章 列表操作4.1遍历整个列表&#xff1a;可能会发生变化的数值&#xff0c;列表可修改4.1.2遍历中的缩进 4.3创建数值列表4.3.1 使用range&#xff08;&#xff09;函数range&#xff08;i&#xff0c;m&#xff09;输出从i到m-1range(m) 打印从0到m-1 4.3.1 使用…

Java集合框架概念详解

目录 1. 什么是Java集合框架&#xff1f;2. 常用接口介绍3. 常用实现类介绍4. 集合框架的应用场景 前言&#xff1a; Java集合框架是Java编程中最重要的工具之一。它提供了一套强大而灵活的数据结构和算法&#xff0c;用于存储和操作数据。本文将详细介绍Java集合框架的概念、常…

数据结构—环形缓冲区

写在前面&#xff0c;2023年11月开始进入岗位&#xff0c;工作岗位是嵌入式软件工程师。2024年是上班的第一年的&#xff0c;希望今年收获满满&#xff0c;增长见闻。 数据结构—环形缓冲区 为什么要使用环形数组&#xff0c;环形数组比起原来的常规数组的优势是什么&#xf…

CLIP is Also an Efficient Segmenter

表1 复现结果–Seed&#xff1a;70.7245673447014&#xff0c;dCRF&#xff1a;74.85437742935268 误差小于0.5个点&#xff0c;可以接受 表4 复现结果–训练300轮&#xff0c;Val&#xff1a;58.76741354153312&#xff0c;Test&#xff1a;59.18210 感想 VOC全部复现完成&…

spring事务默认传播机制REQUIRED的试验(手动开启事务代码+feign远程调用)

transactional注解&#xff0c;默认啥都不指定的时候&#xff0c;我们使用的就是PROPAGATION_REQUIRED这种方式。 PROPAGATION_REQUIRED:业务方法需要在一个事务中运行&#xff0c;如果方法运行时&#xff0c;已处在一个事务中&#xff0c;那么就加入该事务&#xff0c;否则自…

Linux操作系统基础(12):Linux的Shell解释器

1. Shell的介绍 在Linux中&#xff0c;Shell 是一种命令行解释器&#xff0c;它是用户与操作系统内核之间的接口&#xff0c;它负责解释用户输入的命令&#xff0c;并将其转换成系统调用或其他操作系统能够执行的指令。 Shell 提供了一种交互式的方式来与操作系统进行通信&am…

关于使用统一服务器,vscode和网页版jupyter notebook的交互问题

autodl 查看虚拟环境 在antodl上租借了一个服务器&#xff0c;通过在网页上运行jupyter notebook和在vscode中运行&#xff0c;发现环境都默认的是miniconda3。 conda info --envs 当然环境中所有的包都是一样的。 要查看当前虚拟环境中安装的所有包&#xff0c;可以使用以…

C++流媒体服务器 ZLMediaKit框架ZLToolKit源码解读

ZLMediaKit是国人开发的开源C流媒体服务器&#xff0c;同SRS一样是主流的流媒体服务器。 ZLToolKit是基于C11的高性能服务器框架&#xff0c;和ZLMediaKit是同一个作者&#xff0c;ZLMediaKit正是使用该框架开发的。 ZLMediaKit开源地址&#xff1a;https://github.com/ZLMedi…