当前位置: 首页 > news >正文

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

阅读本文你的收获:

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

相关文章:

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

阅读本文你的收获&#xff1a; 了解WebApi项目保存上传图片的三种方式学习在WebApi项目中如何上传图片到指定文件夹中 在ASP.NET Core基础之图片文件(一)-WebApi访问静态图片文章中&#xff0c;学习了如何获取WebApi中的静态图片&#xff0c;本文继续分享如何上传图片。 那么…...

精准掌控 Git 忽略规则:定制化 .gitignore 指南

&#x1f9d9;‍♂️ 诸位好&#xff0c;吾乃诸葛妙计&#xff0c;编程界之翘楚&#xff0c;代码之大师。算法如流水&#xff0c;逻辑如棋局。 &#x1f4dc; 吾之笔记&#xff0c;内含诸般技术之秘诀。吾欲以此笔记&#xff0c;传授编程之道&#xff0c;助汝解技术难题。 &…...

Harmony 开始支持 Flutter ,聊聊 Harmony 和 Flutter 之间的因果

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

k8s 之7大CNI 网络插件

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

stable diffusion 人物高级提示词(一)头部篇

一、女生发型 prompt描述推荐用法Long hair长发一定不要和 high ponytail 一同使用Short hair短发-Curly hair卷发-Straight hair直发-Ponytail马尾high ponytail 高马尾&#xff0c;一定不要和 long hair一起使用&#xff0c;会冲突Pigtails2条辫子-Braid辫子只写braid也会生…...

限制哪些IP能连接postgre

打开C:\Program Files\PostgreSQL\9.4\data\pg_hba.conf 以下代表本机能连&#xff0c;172.16.73.xx都能连&#xff08;/24就代表最后一位是0-255&#xff09;&#xff0c;如果是172.16.73.11/32那就是限制了172.16.73.11才能连&#xff08;实际我设置/32是无效的&#xff09;&…...

可狱可囚的爬虫系列课程 08:新闻数据爬取实战

前言 本篇文章中我带大家针对前面所学 Requests 和 BeautifulSoup4 进行一个实操检验。 相信大家平时或多或少都有看新闻的习惯&#xff0c;那么我们今天所要爬取的网站便是新闻类型的&#xff1a;中国新闻网&#xff0c;我们先来使用爬虫爬取一些具有明显规则或规律的信息&am…...

mysql2pgsql

使用pgloader进行迁移 pgloader是一个强大的数据迁移工具&#xff0c;专为将不同数据库之间的数据迁移到PostgreSQL而设计。它支持从MySQL到PostgreSQL的迁移&#xff0c;并提供了一种简单且灵活的方式来转移数据。 安装pgloader 使用pgloader迁移数据 1、命令行方式 2、脚…...

设计模式-流接口模式

设计模式专栏 模式介绍模式特点应用场景流接口模式和工厂模式的区别代码示例Java实现流接口模式Python实现流接口模式 流接口模式在spring中的应用 模式介绍 流接口模式是一种面向对象的编程模式&#xff0c;它可以使代码更具可读性和流畅性。流接口模式的核心思想是采用链式调…...

Java 堆与栈的作用与区别

栈是运行时的单位&#xff0c;而堆是存储的单位&#xff0c;栈解决程序的运行问题&#xff0c;堆解决数据存储的问题。 一个线程对应一个线程栈&#xff0c;栈是运行单位&#xff0c;里面存储的信息都是跟当前线程相关的信息&#xff0c;包括局部变量、程序运行状态、方法返回…...

再谈小米汽车

文章目录 1. 外观2. 电机3. 电池4. 风阻5. 强度6. 智能驾驶 我在两年前分析过小米造车的形势&#xff0c;大家可以 点击这里查看。今天小米官宣传了新汽车。看一下它公布的主要信息&#xff1a; 1. 外观 汽车外观是向保时捷致敬&#xff0c;因此它的外观特别像保时捷。不过外…...

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、匿名函数 定义时候没有任何变量引用的函数 匿名函数自调&#xff1a;函数只执行一次 (function(a, b){console.log(a b);} )(1, 2);// 等价于 function foo (a, b){console.log(a b); }foo(1, …...

DNS主从服务器、转发(缓存)服务器

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

第二十一章 网络编程

第二十一章 网络编程 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#中&#xff0c;接口是一种定义方法但不包含实现的方式&#xff0c;可以被多个类实现以支持不同的行为。通过接口&#xff0c;我们可以定义一组标准的成员&#xff0c;让类遵循特定的契约。 下面是一个关于接口和实现的简单示例&#xff1a; // 定义一个接口 public inter…...

【java爬虫】股票数据获取工具前后端代码

前面我们有好多文章都是在介绍股票数据获取工具&#xff0c;这是一个前后端分离项目 后端技术栈&#xff1a;springboot&#xff0c;sqlite&#xff0c;jdbcTemplate&#xff0c;okhttp 前端技术栈&#xff1a;vue&#xff0c;element-plus&#xff0c;echarts&#xff0c;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转换器

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

告别手动拷贝!用Qt Creator远程调试嵌入式Linux应用(保姆级配置流程)

告别手动拷贝&#xff01;用Qt Creator远程调试嵌入式Linux应用&#xff08;保姆级配置流程&#xff09; 嵌入式开发中&#xff0c;最令人头疼的莫过于反复的"编译-拷贝-运行/调试"循环。每次修改代码后&#xff0c;都需要手动将可执行文件拷贝到开发板&#xff0c;再…...

无国界技术创业:构建全球化产品支持与远程协作体系

1. 从“车库”到“云端”&#xff1a;无国界创业的底层逻辑变迁 十年前&#xff0c;如果你在硅谷创立一家芯片设计工具&#xff08;EDA&#xff09;或嵌入式软件公司&#xff0c;头两年的客户拜访路线图大概就是101号公路沿线。工程师可以早上开车去圣何塞的客户办公室&#xf…...

零基础避坑指南什么工具可以录音转待办

还在手动把面试录音扒成文字再摘待办&#xff1f;做HR的谁没踩过这个坑&#xff1a;整理一小时&#xff0c;漏了候选人关键信息&#xff0c;还把待办记错&#xff0c;今天直接讲能直接上手的方法&#xff0c;零基础也不会踩坑。我做HR那几年&#xff0c;光整理录音待办就熬了无…...

QMCDecode终极指南:3分钟解锁QQ音乐加密文件,让音乐自由播放

QMCDecode终极指南&#xff1a;3分钟解锁QQ音乐加密文件&#xff0c;让音乐自由播放 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录…...

开题报告一次通关密码:告别反复修改,虎贲等考 AI 重新定义高效开题

每一位本硕博学生都懂&#xff1a;开题不顺&#xff0c;论文全乱。开题报告是毕业论文的 “总设计图”&#xff0c;选题、框架、文献、技术路线只要一项不达标&#xff0c;就会被导师反复打回&#xff0c;浪费时间、消耗心态&#xff0c;甚至直接拖慢整个毕业节奏。可自己写开题…...

基于LLM的智能体驱动文字冒险游戏引擎设计与实现

1. 项目概述&#xff1a;一个AI驱动的文字冒险游戏引擎最近在GitHub上闲逛&#xff0c;发现了一个挺有意思的项目&#xff0c;叫droxey/agentadventure。光看名字&#xff0c;大概能猜到它和“智能体”&#xff08;Agent&#xff09;以及“冒险”&#xff08;Adventure&#xf…...

【Instagram内容工业化生产】:ChatGPT + Canva + Notion三件套实战手册(含私有化部署Prompt库下载权限)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Instagram内容工业化生产的底层逻辑与范式迁移 Instagram内容工业化生产已从个体化、灵感驱动的创作模式&#xff0c;转向数据闭环、模块化协同与AI增强的系统工程。其底层逻辑根植于三重耦合&#xff…...

基于GitHub Webhook的自动化协作平台:Octopal架构设计与实现

1. 项目概述&#xff1a;一个面向开发者的开源协作平台最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“pmbstyle/Octopal”。光看名字&#xff0c;你可能会联想到“Octopus”&#xff08;章鱼&#xff09;和“GitHub”&#xff08;其吉祥物是章鱼猫Octocat&#xff09;&…...

北京数据恢复公司哪个公司好

在当今数字化时代&#xff0c;数据的重要性不言而喻。无论是个人用户的珍贵照片、文档&#xff0c;还是企业的重要商业数据&#xff0c;一旦丢失&#xff0c;都可能造成巨大的损失。在北京&#xff0c;有众多的数据恢复公司&#xff0c;那么哪家公司才是最好的选择呢&#xff1…...

RAGday13-day15

Day13&#xff1a;RAG 常见问题 & 调优实战检索不到内容原因&#xff1a;分块太小、关键词太偏、没做混合检索解决&#xff1a;换递归 / 父子分块、加上 ES 混合检索、做 Query 改写搜到内容多但答不对原因&#xff1a;检索杂、没重排、没上下文压缩解决&#xff1a;加 Rer…...