龙空技术网

七爪源码:使用 .NET Core 6 Web API 上传单个和多个文件

庄志炎 763

前言:

今天小伙伴们对“netmvc上传多个”大致比较关心,朋友们都需要了解一些“netmvc上传多个”的相关内容。那么小编也在网摘上搜集了一些对于“netmvc上传多个””的相关文章,希望我们能喜欢,姐妹们快快来了解一下吧!

我们将借助 .NET 提供的 IFormFile 接口和其他接口以及使用 .NET Core 6 Web API 的分步实现来讨论单个和多个文件上传。

介绍

.NET 提供了一个 IFormFile 接口,它表示 HTTP 请求中传输的文件。此外,它还提供了许多属性,如 ContentDisposition、ContentType、FileName、Headers、Name 和 Length。IFormFile 还提供了许多方法,例如复制请求流内容、打开请求流进行读取等等。

分步实施

步骤1

创建新的 .NET Core Web API

第2步

安装以下 NuGet 包

第 3 步

创建以下文件实体

FileDetails.cs

using System.ComponentModel.DataAnnotations;using System.ComponentModel.DataAnnotations.Schema;namespace FileUpload.Entities{    [Table("FileDetails")]    public class FileDetails    {        [Key]        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]        public int ID { get; set; }        public string FileName { get; set; }        public byte[] FileData { get; set; }        public FileType FileType { get; set; }    }}

FileUploadModel

namespace FileUpload.Entities{    public class FileUploadModel    {        public IFormFile FileDetails { get; set; }        public FileType FileType { get; set; }    }}

FileType

namespace FileUpload.Entities{    public enum FileType    {        PDF = 1,        DOCX = 2    }}

第4步

接下来,Data 文件夹内的 DbContextClass.cs 类

using FileUpload.Entities;using Microsoft.EntityFrameworkCore;namespace FileUpload.Data{    public class DbContextClass : DbContext    {        protected readonly IConfiguration Configuration;        public DbContextClass(IConfiguration configuration)        {            Configuration = configuration;        }        protected override void OnConfiguring(DbContextOptionsBuilder options)        {            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));        }        public DbSet<FileDetails> FileDetails { get; set; }    }}

第 5 步

创建 IFileService 和 FileService 文件

文件服务

using FileUpload.Entities;namespace FileUpload.Services{    public interface IFileService    {        public Task PostFileAsync(IFormFile fileData, FileType fileType);        public Task PostMultiFileAsync(List<FileUploadModel> fileData);        public Task DownloadFileById(int fileName);    }}

FileService

using FileUpload.Data;using FileUpload.Entities;using Microsoft.EntityFrameworkCore;namespace FileUpload.Services{    public class FileService : IFileService    {        private readonly DbContextClass dbContextClass;        public FileService(DbContextClass dbContextClass)        {            this.dbContextClass = dbContextClass;        }        public async Task PostFileAsync(IFormFile fileData, FileType fileType)        {            try            {                var fileDetails = new FileDetails()                {                    ID = 0,                    FileName = fileData.FileName,                    FileType = fileType,                };                using (var stream = new MemoryStream())                {                    fileData.CopyTo(stream);                    fileDetails.FileData = stream.ToArray();                }                var result = dbContextClass.FileDetails.Add(fileDetails);                await dbContextClass.SaveChangesAsync();            }            catch (Exception)            {                throw;            }        }        public async Task PostMultiFileAsync(List<FileUploadModel> fileData)        {            try            {                foreach(FileUploadModel file in fileData)                {                    var fileDetails = new FileDetails()                    {                        ID = 0,                        FileName = file.FileDetails.FileName,                        FileType = file.FileType,                    };                    using (var stream = new MemoryStream())                    {                        file.FileDetails.CopyTo(stream);                        fileDetails.FileData = stream.ToArray();                    }                    var result = dbContextClass.FileDetails.Add(fileDetails);                }                await dbContextClass.SaveChangesAsync();            }            catch (Exception)            {                throw;            }        }        public async Task DownloadFileById(int Id)        {            try            {                var file =  dbContextClass.FileDetails.Where(x => x.ID == Id).FirstOrDefaultAsync();                var content = new System.IO.MemoryStream(file.Result.FileData);                var path = Path.Combine(                   Directory.GetCurrentDirectory(), "FileDownloaded",                   file.Result.FileName);                await CopyStream(content, path);            }            catch (Exception)            {                throw;            }        }        public async Task CopyStream(Stream stream, string downloadPath)        {            using (var fileStream = new FileStream(downloadPath, FileMode.Create, FileAccess.Write))            {               await stream.CopyToAsync(fileStream);            }        }    }}

第 6 步

在控制器部分创建 FilesController.cs

using FileUpload.Entities;using FileUpload.Services;using Microsoft.AspNetCore.Http;using Microsoft.AspNetCore.Mvc;namespace FileUpload.Controllers{    [Route("api/[controller]")]    [ApiController]    public class FilesController : ControllerBase    {        private readonly IFileService _uploadService;        public FilesController(IFileService uploadService)        {            _uploadService = uploadService;        }        /// <summary>        /// Single File Upload        /// </summary>        /// <param name="file"></param>        /// <returns></returns>        [HttpPost("PostSingleFile")]        public async Task<ActionResult> PostSingleFile([FromForm] FileUploadModel fileDetails)        {            if(fileDetails == null)            {                return BadRequest();            }            try            {                await _uploadService.PostFileAsync(fileDetails.FileDetails, fileDetails.FileType);                return Ok();            }            catch (Exception)            {                throw;            }        }        /// <summary>        /// Multiple File Upload        /// </summary>        /// <param name="file"></param>        /// <returns></returns>        [HttpPost("PostMultipleFile")]        public async Task<ActionResult> PostMultipleFile([FromForm] List<FileUploadModel> fileDetails)        {            if (fileDetails == null)            {                return BadRequest();            }            try            {                await _uploadService.PostMultiFileAsync(fileDetails);                return Ok();            }            catch (Exception)            {                throw;            }        }        /// <summary>        /// Download File        /// </summary>        /// <param name="file"></param>        /// <returns></returns>        [HttpGet("DownloadFile")]        public async Task<ActionResult> DownloadFile(int id)        {            if (id < 1)            {                return BadRequest();            }            try            {                await _uploadService.DownloadFileById(id);                return Ok();            }            catch (Exception)            {                throw;            }        }    }}

第 7 步

在 Program Class 和 DI Container 中配置一些服务

using FileUpload.Data;using FileUpload.Services;var builder = WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.AddControllers();// Learn more about configuring Swagger/OpenAPI at ;builder.Services.AddSwaggerGen();builder.Services.AddDbContext<DbContextClass>();builder.Services.AddScoped<IFileService, FileService>();var app = builder.Build();// Configure the HTTP request pipeline.if (app.Environment.IsDevelopment()){    app.UseSwagger();    app.UseSwaggerUI();}app.UseAuthorization();app.MapControllers();app.Run();

第 8 步

在 SQL Server 中创建一个新数据库并将其命名为 FileUploadDemo

第 9 步

接下来,使用以下脚本创建 FileDetails 表

USE [FileUploadDemo]GO/****** Object:  Table [dbo].[FileDetails]    Script Date: 10/1/2022 5:51:22 PM ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [dbo].[FileDetails](	[ID] [int] IDENTITY(1,1) NOT NULL,	[FileName] [nvarchar](80) NOT NULL,	[FileData] [varbinary](max) NOT NULL,	[FileType] [int] NULL, CONSTRAINT [PK_FileDetails] PRIMARY KEY CLUSTERED(	[ID] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]GO

第 10 步

将数据库连接放在 appsettings.json 文件中

{  "Logging": {    "LogLevel": {      "Default": "Information",      "Microsoft.AspNetCore": "Warning"    }  },  "AllowedHosts": "*",  "ConnectionStrings": {    "DefaultConnection": "Data Source=DESKTOP-****;;Initial Catalog=FileUploadDemo;User Id=sa;Password=database;"  }}

第 11 步

最后,我们运行应用程序

步骤 12

现在,我们将通过提供基于 enum id 的文件和文件类型,使用 swagger 上传单个文件

第 13 步

此外,为了上传多个文件,我们使用 Postman。 在这里您可以看到我们使用数组索引来发送文件及其类型,它会正常工作。

第 14 步

稍后,根据文件 id,我们可以在本地系统上的指定路径位置下载文件

第 15 步

这里可以在指定位置看到下载的文件

此外,在数据库中,我们可以看到我们已经使用上述端点上传的任何文件

结论

在本文中,我们讨论了使用 IFormFile 的单个和多个文件上传以及使用 .NET Core Web API 的分步实现,以及从数据库中读取文件并将其保存到指定位置。

快乐学习!

关注七爪网,获取更多APP/小程序/网站源码资源!

标签: #netmvc上传多个