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

Web开发:ABP框架10——使用数据库存储文件,完成文件的下载和上传

一、简要介绍

  1. 字节数组:字节数组是存储数据的字节序列,常用于二进制数据(如图片、音视频、文档等)的表示。

  2. 文件和字节的关系:文件是由字节构成,字节是文件内容的基本单位。

  3. 文件以字节形式存储在服务器数据库与文件夹的比较

存储方式优点缺点
数据库存储便于管理和检索,数据安全性高可能占用更多存储空间,性能较低
文件夹存储存储方便,易于访问不便于数据管理和安全控制,缺乏统一性

        4.字节数组在数据库的存储方式 

  • SQL Server:VARBINARY(最大2GB)
  • MySQL:BLOB(最大64KB)、MEDIUMBLOB(最大16MB)、LONGBLOB(最大 4GB)

        5.字节数组在C#的类型

public byte[] FileData { get; set; }  //使用byte[]表达字节数组

二、本文数据准备

1.数据表

建表语法示例(sqlserver)

USE [TestABP]
GOSET ANSI_NULLS ON
GOSET QUOTED_IDENTIFIER ON
GOSET ANSI_PADDING ON
GOCREATE TABLE [dbo].[Files]([Id] [int] IDENTITY(1,1) NOT NULL,[FileName] [nvarchar](255) NULL,[FileData] [varbinary](max) NULL, -- 使用varbinary表达字节数组
PRIMARY KEY CLUSTERED 
([Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]GOSET ANSI_PADDING OFF
GO

2.本文实体

本文采用的ORM框架是:freesql

[Table("Files")]
public class Files  
{[FreeSql.DataAnnotations.Column(IsPrimary = true,IsIdentity = true,Name ="Id")]public int Id { get; set; }[Column("FileName")]public string FileName { get; set; }[Column("FileData")]public int? FileData { get; set; }}

三、【Demo】文件下载

/// <summary>
/// 下载文件
/// </summary>
/// <returns></returns>
[Route("DownLoadFile")]
[HttpGet]
public async Task DownLoadFile()
{//通过查库获取字节形式的文件byte[] file = _freeSql.Select<Files>().Where(x => x.Id == 1).ToOne()?.FileData;// 检查文件是否存在if (file != null){var context = _httpContextAccessor.HttpContext;var response = context.Response;response.Clear();response.Headers.Add("Content-Disposition", $"attachment; filename=Demo.xls");// 设置响应头:指定下载的文件名response.ContentType = "application/octet-stream"; // 指定为MIME类型,浏览器根据扩展名自动识别响应编辑器打开response.Body.WriteAsync(file, 0, file.Length).Wait();//写入响应流}else{throw new FileNotFoundException("文件未找到");}}

 

【中文乱码问题】

设置MIME类型时,声明utf-8 字符集,并且用WebUtility.UrlEncode处理中文字符。

response.Headers.Add("Content-Disposition", $"attachment;filename*=utf-8''{WebUtility.UrlEncode("123下载.xlsx")}");

四、【Demo】文件上传

/// <summary>
/// 上传文件
/// </summary>
/// <returns></returns>
[Route("UploadFile")]
[HttpPost]
public async Task<string> UploadFile(IFormFile file)
{if (file == null || file.Length == 0){throw new FileNotFoundException("未选择文件上传.");}// 读取文件的内容using (var memoryStream = new MemoryStream()){await file.CopyToAsync(memoryStream);var fileData = memoryStream.ToArray();// 将文件存储到数据库中var fileRecord = new Files{FileData = fileData,FileName = file.FileName, // 可以存储文件名或其他相关信息};// 使用FreeSQL插入数据await _freeSql.Insert(fileRecord).ExecuteAffrowsAsync();return "文件上传成功!";}
}

相关文章:

Web开发:ABP框架10——使用数据库存储文件,完成文件的下载和上传

一、简要介绍 字节数组&#xff1a;字节数组是存储数据的字节序列&#xff0c;常用于二进制数据&#xff08;如图片、音视频、文档等&#xff09;的表示。 文件和字节的关系&#xff1a;文件是由字节构成&#xff0c;字节是文件内容的基本单位。 文件以字节形式存储在服务器数…...

SystemVerilog语法之内建数据类型

简介&#xff1a;SystemVerilog引进了一些新的数据类型&#xff0c;具有以下的优点&#xff1a;&#xff08;1&#xff09;双状态数据类型&#xff0c;更好的性能&#xff0c;更低的内存消耗&#xff1b;&#xff08;2&#xff09;队列、动态和关联数组&#xff0c;减少内存消耗…...

NestJS-Knife4j

文章目录 前言✅ 一、什么是 Knife4j&#xff1f;✅ 二、Knife4j 与 Swagger 对比✅ 三、NestJS-Knife4j 集成1. 安装依赖2. 配置 Swagger 与 Knife4j3. 启动应用并访问接口文档 ✅ 四、功能增强1. **接口分组**2. **请求/响应示例**3. **接口文档的美化** ✅ 五、总结 前言 N…...

【项目管理】成本类计算 笔记

项目管理-相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 &#xff08;一&#xff09;知识总览 项目管理知识域 知识点&#xff1a; &#xff08;项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域&#xff09; 对应&…...

手机投屏到电视方法

一、投屏软件 比如乐播投屏 二、视频软件 腾讯视频、爱奇艺 三、手机无线投屏功能 四、有线投屏 五、投屏器...

(三十)安卓开发中的MVP模式详解

在安卓开发中&#xff0c;MVP&#xff08;Model-View-Presenter&#xff09; 是一种常见的软件架构模式&#xff0c;它通过将应用程序的逻辑与用户界面分离&#xff0c;使得代码更加模块化、易于维护和测试。本文将详细讲解MVP模式的组成部分、工作流程、优点&#xff0c;并结合…...

基于MuJoCo物理引擎的机器人学习仿真框架robosuite

Robosuite 基于 MuJoCo 物理引擎&#xff0c;能支持多种机器人模型&#xff0c;提供丰富多样的任务场景&#xff0c;像基础的抓取、推物&#xff0c;精细的开门、拧瓶盖等操作。它可灵活配置多种传感器&#xff0c;提供本体、视觉、力 / 触觉等感知数据。因其对强化学习友好&am…...

配置管理CM

以下是关于项目管理中 配置管理 的详细解析,结合高项(如软考高级信息系统项目管理师)教材内容,从理论到实践进行系统阐述: 一、配置管理的基本概念 1. 定义 配置管理(Configuration Management, CM)是识别、记录、控制项目成果(产品、服务或过程)的物理和功能特征,…...

13.编码器的结构

从入门AI到手写Transformer-13.编码器的结构 13.编码器的结构代码 整理自视频 老袁不说话 。 13.编码器的结构 T r a n s f o r m e r E n c o d e r : 输入 [ b , n ] TransformerEncoder:输入[b,n] TransformerEncoder:输入[b,n] E m b e d d i n g : − > [ b , n , d ]…...

[原理分析]安卓15系统大升级:Doze打盹模式提速50%,续航大幅增强,省电提升率5%

技术原理:借鉴中国友商思路缩短进入Doze的时序 开发者米沙尔・拉赫曼(Mishaal Rahman)在其博文中透露&#xff0c;谷歌对安卓15系统进行了显著优化&#xff0c;使得设备进入“打盹模式”(Doze Mode)的速度提升了50%&#xff0c;并且部分机型的待机时间因此得以延长三小时。设备…...

cdp-(Chrome DevTools Protocol) browserscan检测原理逆向分析

https://www.browserscan.net/zh/bot-detection 首先,打开devtools后访问网址,检测结果网页显示红色Robot,标签插入位置,确定断点位置可以hook该方法,也可以使用插件等方式找到这个位置,本篇不讨论. Robot标签是通过insertBefore插入的. 再往上追栈可以发现一个32长度数组,里面…...

【Java面试笔记:基础】1.谈谈你对Java平台的理解?

前言 Java 是历史悠久且主流的编程语言&#xff0c;拥有庞大的开发者群体和广泛的应用领域。通过系统学习和实践&#xff0c;构建扎实的 Java 知识体系&#xff0c;提升面试成功率 笔记核心内容 1. Java 平台的核心特性 跨平台特性&#xff1a;Java 的核心特性之一是“Writ…...

Containerd与Docker的相爱相杀:容器运行时选型指南

容器运行时&#xff08;Container Runtime&#xff09;作为云原生基础设施的底层引擎&#xff0c;正从Docker一家独大走向多元化竞争。本文将深入剖析Containerd与Docker的技术血缘、性能差异及选型策略&#xff0c;揭示如何根据场景需求选择最优解。 一、技术血缘&#xff1a;…...

Java第五节:继承thread类创建线程

1、创建类Thread01 创建类Thread01然后继承thread类 2、重写run函数 3、运行线程 在主函数创建两个线程&#xff0c;并执行。...

vite安装及使用

没特殊要求的项目,还是怎么简单怎么来╮(╯▽╰)╭ 一、Vite 基础知识 1. 什么是 Vite? Vite 是一个前端构建工具,专注于开发服务器速度和优化构建过程。特点: 快速冷启动:利用 ES 模块的原生支持,实现快速的开发服务器启动。即时热更新:在开发过程中,修改代码后可以…...

Oracle expdp的 EXCLUDE 参数详解

Oracle expdp的 EXCLUDE 参数详解 EXCLUDE 是 Oracle Data Pump Export (expdp) 工具中的一个关键参数&#xff0c;用于指定在导出过程中要排除的对象或对象类型。 一、基本语法 expdp username/password DUMPFILEexport.dmp DIRECTORYdpump_dir EXCLUDEobject_type[:name_c…...

C#/.NET/.NET Core技术前沿周刊 | 第 35 期(2025年4.14-4.20)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿、推荐…...

《MySQL:MySQL表的基本查询操作CRUD》

CRUD&#xff1a;Create&#xff08;创建&#xff09;、Retrieve&#xff08;读取&#xff09;、Update&#xff08;更新&#xff09;、Delete&#xff08;删除&#xff09;。 Create into 可以省略。 插入否则更新 由于主键或唯一键冲突而导致插入失败。 可以选择性的进行同步…...

CF2096F Wonderful Impostors

题解 看到题意很容易想到用双指针来维护所有可行的区间&#xff0c;但是显然不能对所有的 1 区间来维护所有的可行区间&#xff0c;这样的区间数量会太多&#xff0c;我们无法快速进行判断。 所以只能对满足答案的所有区间进行双指针&#xff0c;这就要求我们如何快速插入和删…...

多维度信息捕捉:利用向量、稀疏向量、全文搜索及张量实现RAG的极致性能

开源 AI 原生数据库 Infinity 0.2 release 正式发布&#xff0c;提供了 2 种新数据类型&#xff1a;稀疏向量Sparse Vector 和 张量Tensor&#xff0c;在此前的全文搜索和向量搜索之外&#xff0c; Infinity 提供了更多的召回手段&#xff0c;如下图所示&#xff0c;用户可以采…...

vscode使用remote ssh插件连接服务器的问题

本人今天发现自己的vscode使用remote ssh连接不上服务器了&#xff0c;表现是&#xff1a;始终在初始化 解决方法&#xff1a; 参考链接&#xff1a;vscode remote-ssh 连接失败的基本原理和优雅的解决方案 原因 vscode 的 SSH 之所以能够拥有比传统 SSH 更加强大的功能&a…...

基础版-图书管理系统

现在我们用面向对象编程&#xff0c;首先我们要明确这个图书管理系统的对象有哪些&#xff1f; 图书管理需要管理图书&#xff08;对象1&#xff09;&#xff0c;在哪管理图书呢&#xff1f;书架&#xff08;对象2&#xff09;上 然后由谁来管呢&#xff1f;有两类人&#xf…...

【单片机 C语言】单片机学习过程中常见C库函数(学习笔记)

memset() ​C 标准库 - <string.h> string .h 头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。 <string.h> 是 C 标准库中的一个头文件&#xff0c;提供了一组用于处理字符串和内存块的函数。这些函数涵盖了字符串复制、连接、比较、搜索和内存操作…...

神经网络优化 - 小批量梯度下降之批量大小的选择

上一博文学习了小批量梯度下降在神经网络优化中的应用&#xff1a; 神经网络优化 - 小批量梯度下降-CSDN博客 在小批量梯度下降法中&#xff0c;批量大小(Batch Size)对网络优化的影响也非常大&#xff0c;本文我们来学习如何选择小批量梯度下降的批量大小。 一、批量大小的…...

Novartis诺华制药社招入职综合能力测评真题SHL题库考什么?

一、综合能力测试 诺华制药的入职测评中&#xff0c;综合能力测试是重要的一部分&#xff0c;主要考察应聘者的问题解决能力、数值计算能力和逻辑推理能力。测试总时长为46分钟&#xff0c;实际作答时间为36分钟&#xff0c;共24题。题型丰富多样&#xff0c;包括图形变换题、分…...

文件的物理结构和逻辑结构的区分

文件的物理结构和逻辑结构是文件系统中两个重要的概念&#xff0c;它们分别描述了文件在存储设备上的实际存储方式以及用户在编程或操作文件时所看到的抽象组织形式。理解这两者的区别和联系对于深入掌握文件系统的设计和实现至关重要。 ​一、文件的逻辑结构 ​定义 文件的逻…...

C语言学习记录(16)文件操作7

前面学的东西感觉都跟写代码有关系&#xff0c;怎么突然就开始说文件了&#xff0c;有什么用呢&#xff1f; 其实&#xff0c;文件是另一种数据存储的方式&#xff0c;学会使用文件就可以让我们的数据持久的保存。 一、文件是什么 就算没有学过相关的知识&#xff0c;在这么…...

Coze平台​ 创建AI智能体的详细步骤指南

一、创建智能体的基础流程​ ​注册与登录​ 访问Coze官网&#xff08;www.coze.cn&#xff09;&#xff0c;使用邮箱或手机号注册账号并登录。 ​创建智能体​ 在控制台点击左侧“”按钮&#xff0c;选择“创建智能体”&#xff0c;输入名称&#xff08;如“职场鼓励师”&…...

《作用域大冒险:从闭包到内存泄漏的终极探索》

“爱自有天意&#xff0c;天有道自不会让有情人分离” 大家好&#xff0c;关于闭包问题其实实际上是js作用域的问题&#xff0c;那么js有几种作用域呢&#xff1f; 作用域类型关键字/场景作用域范围示例全局作用域var&#xff08;无声明&#xff09;整个程序var x 10;函数作用…...

android Stagefright框架

作为Android音视频开发人员&#xff0c;学习Stagefright框架需要结合理论、源码分析和实践验证。以下是系统化的学习路径&#xff1a; 1. 基础准备 熟悉Android多媒体体系 掌握MediaPlayer、MediaCodec、MediaExtractor等核心API的用法。 理解Android的OpenMAX IL&#xff08…...