随笔 - 26,  文章 - 0,  评论 - 3,  阅读 - 8663
参考 ASP.NET Core Blazor 文件上传
下载只需要访问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 };

        }
    }
复制代码

 

posted on   Sleepy-Person  阅读(725)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示