前言:
今天小伙伴们对“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上传多个