当前位置: 首页 > 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…...

如何用Unity打造一款MMORPG:从零开始的全流程实战教程

如何用Unity打造一款MMORPG&#xff1a;从零开始的全流程实战教程 当《魔兽世界》《最终幻想14》等经典MMORPG持续创造商业奇迹时&#xff0c;许多开发者都怀揣着打造下一个爆款的梦想。Unity引擎凭借其跨平台能力和完善的工具链&#xff0c;已成为独立团队和中小厂商开发大型多…...

VS Code + Flask新手避坑指南:从虚拟环境配置到第一个Hello World页面

VS Code Flask新手避坑指南&#xff1a;从虚拟环境配置到第一个Hello World页面 刚接触Flask框架的开发者常会遇到各种环境配置问题——虚拟环境切换失败、包导入报错、路由访问404……这些看似简单的坑往往让人耗费数小时。本文将用最小可行方案带你在VS Code中快速搭建Flas…...

Harmonyos应用实例215: 条件概率模拟器

7. 条件概率模拟器 功能简介:通过模拟抽卡片、掷骰子等实验,展示条件概率的计算方法,验证贝叶斯定理。支持调整实验参数,实时显示概率结果和理论值对比,帮助学生理解条件概率的概念。 ArkTS代码: @Entry @Component struct ConditionalProbability {@State private...

SEO_从零开始,手把手教你制定SEO优化方案(126 )

<h2>SEO优化的基本概念</h2> <p>SEO&#xff0c;全称Search Engine Optimization&#xff0c;是搜索引擎优化的简称&#xff0c;旨在提高网站在搜索引擎中的自然排名&#xff0c;从而增加网站的可见度和流量。对于初学者来说&#xff0c;SEO可能听起来有点复…...

高效音乐资源获取:Soundcloud Music Downloader全功能解析

高效音乐资源获取&#xff1a;Soundcloud Music Downloader全功能解析 【免费下载链接】scdl Soundcloud Music Downloader 项目地址: https://gitcode.com/gh_mirrors/sc/scdl 基于Python的跨平台音乐资源管理方案 一、音乐下载的痛点与解决方案 在数字音乐时代&…...

全格式文档智能处理:AnythingLLM的多模态知识管理解决方案

全格式文档智能处理&#xff1a;AnythingLLM的多模态知识管理解决方案 【免费下载链接】anything-llm 这是一个全栈应用程序&#xff0c;可以将任何文档、资源&#xff08;如网址链接、音频、视频&#xff09;或内容片段转换为上下文&#xff0c;以便任何大语言模型&#xff08…...

用LVGL玩转嵌入式UI:5个实战控件代码详解(按钮/滑块/图片/标签/开关)

LVGL嵌入式UI开发实战&#xff1a;五大核心控件深度解析与代码优化 在资源受限的嵌入式设备上实现流畅美观的用户界面&#xff0c;一直是开发者面临的挑战。LVGL&#xff08;Light and Versatile Graphics Library&#xff09;作为一款轻量级开源图形库&#xff0c;凭借其丰富的…...

ssm+java2026年毕设私教预约系统【源码+论文】

本系统&#xff08;程序源码&#xff09;带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景关于会议管理问题的研究&#xff0c;现有研究主要以传统纸质登记和简单的OA系统为主&#xff0c;专门针对智能化、全流程会议预…...

LangGraph实战:5分钟给你的AI助手装上‘对话记忆’,告别每轮都是新朋友

LangGraph实战&#xff1a;5分钟为AI助手构建对话记忆系统 每次和AI对话都像初次见面&#xff1f;这个问题困扰着许多开发者。想象一下&#xff0c;你告诉助手"我叫Alex"&#xff0c;下一句问"你知道我的名字吗&#xff1f;"&#xff0c;它却一脸茫然地回答…...

高效解决多设备滚动冲突难题的Scroll Reverser工具

高效解决多设备滚动冲突难题的Scroll Reverser工具 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser Scroll Reverser是一款专为macOS用户设计的开源效率工具&#xff0c;它能够为…...