下载只需要访问API下的DownloadFile 可直接按照文件名称下载
Blazor
显示页
<InputFile OnChange="@OnInputFileChange" /> <button @onclick="(()=>ToUpload())" class="btn btn-primary btn-sm" style="margin-left:1rem">上传</button>
方法体
#region 文件上传 前端页面方法体 private UploadResult uploadResults = new(); public string filesName { get; set; } public MultipartFormDataContent content { get; set; } = new MultipartFormDataContent(); /// <summary> /// 读取文件并且复制 /// </summary> /// <param name="e"></param> /// <returns></returns> public Task OnInputFileChange(InputFileChangeEventArgs e) { long maxFileSize = 1024 * 2000; content = new MultipartFormDataContent(); if (uploadResults.fileName == filesName) { var fileContent = new StreamContent(e.File.OpenReadStream(maxFileSize)); fileContent.Headers.ContentType = new MediaTypeHeaderValue(e.File.ContentType); content.Add( content: fileContent, name: "\"files\"", fileName: e.File.Name); } return Task.CompletedTask; } /// <summary> /// 开始上传 /// </summary> /// <returns></returns> public async Task ToUpload() { var response = await _UpdateManagerService.OnInputFileChange(content); uploadResults = response; } #endregion 文件上传
WebAPI
[Route("api/[controller]")] [ApiController] public class FileManagerController : ControllerBase { private readonly IWebHostEnvironment env; private readonly ILogger<FileManagerController> logger; public FileManagerController(IWebHostEnvironment env, ILogger<FileManagerController> logger) { this.env = env; this.logger = logger; } /// <summary> /// 文件父路径名称 /// </summary> public string uploadsFile = "unsafe_uploads"; /// <summary> /// 文件上传 /// </summary> /// <param name="files"></param> /// <returns></returns> [HttpPost] public async Task<ActionResult<UploadResult>> PostFile([FromForm] IEnumerable<IFormFile> files) { //最大文件不超过 long maxFileSize = 1024 * 999999; //目前Ip var file = files.First(); var resourcePath = new Uri($"{Request.Scheme}://{Request.Host}/"); var uploadResult = new UploadResult(); string trustedFileNameForFileStorage; var untrustedFileName = file.FileName; uploadResult.FileName = untrustedFileName; var trustedFileNameForDisplay = WebUtility.HtmlEncode(untrustedFileName); if (file.Length == 0) { logger.LogInformation("{FileName}大小为0", trustedFileNameForDisplay); uploadResult.ErrorCode = 1; } else if (file.Length > maxFileSize) { logger.LogInformation("{FileName} 的大小是 {Length} " + "超过最大限制 {Limit}", trustedFileNameForDisplay, file.Length, maxFileSize); uploadResult.ErrorCode = 2; } else { try { //trustedFileNameForFileStorage = Path.GetRandomFileName(); var path = Path.Combine(env.ContentRootPath, env.EnvironmentName, uploadsFile, trustedFileNameForDisplay); await using FileStream fs = new(path, FileMode.Create); await file.CopyToAsync(fs); logger.LogInformation("{FileName} 保存在 {Path}", trustedFileNameForDisplay, path); uploadResult.ErrorCode = 0; uploadResult.Uploaded = true; //给文件重新起名字 //uploadResult.StoredFileName = trustedFileNameForFileStorage; uploadResult.Url = resourcePath + "/" + uploadsFile + "/" + trustedFileNameForDisplay; return Ok(uploadResult); } catch (IOException ex) { logger.LogError("{FileName} 错误上传: {Message}", trustedFileNameForDisplay, ex.Message); uploadResult.ErrorCode = 3; } } return NotFound(uploadResult); } /// <summary> /// 按照文件名称下载 /// </summary> /// <param name="Name"></param> /// <returns></returns> [Route("DownloadFile")] [HttpGet] public IActionResult DownloadFile(string Name) { string fileName = Name; string filePath = Path.Combine(env.ContentRootPath, env.EnvironmentName, uploadsFile, Name); return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName }; } }
本文来自博客园,作者:Sleepy-Person,转载请注明原文链接:https://www.cnblogs.com/Sleepy-Person/p/16652972.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战