博客
关于我
asp.net core Webapi 3.1 上传文件的多种方法(附大文件上传) 以及swagger ui 上传文件
阅读量:398 次
发布时间:2019-03-05

本文共 9759 字,大约阅读时间需要 32 分钟。

WebApi 后端代码与文件上传实现详细指南

1. WebApi 后端代码

1.1 文件上传接口实现

using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using Microsoft.AspNetCore.Authorization;using Microsoft.AspNetCore.Mvc.Filters;using Microsoft.AspNetCore.Mvc;using ZRFCoreTestMongoDB.Model;using ZRFCoreTestMongoDB.Commoms;using Microsoft.IdentityModel.Tokens;using System.Text;using System.Security.Claims;using System.IdentityModel.Tokens.Jwt;using Microsoft.AspNetCore.Http;using System.IO;using Microsoft.AspNetCore.Hosting;[ApiController][Route("api/[Controller]")]public class MyJwtTestController : ControllerBase{    private readonly JwtConfigModel _jsonmodel;    private IWebHostEnvironment _evn;    public MyJwtTestController(IWebHostEnvironment evn)    {        this._evn = evn;        _jsonmodel = AppJsonHelper.InitJsonModel();    }    [HttpPost, Route("UpFile")]    public async Task
UpFile([FromForm] IFormCollection formcollection) { ApiResult result = new ApiResult(); try { var files = formcollection.Files; if (files != null && files.Any()) { var file = files[0]; string contentType = file.ContentType; string fileOrginname = file.FileName; // 新建文本文档.txt 原始的文件名称 string fileExtention = Path.GetExtension(fileOrginname); // 判断文件的格式是否正确 string cdipath = Directory.GetCurrentDirectory(); string fileupName = Guid.NewGuid().ToString("d") + fileExtention; string upfilePath = Path.Combine(cdipath + "/myupfiles/", fileupName); if (!System.IO.File.Exists(upfilePath)) { using (var stream = System.IO.File.Create(upfilePath)) { } } double count = await UpLoadFileStreamHelper.UploadWriteFileAsync(file.OpenReadStream(), upfilePath); result.message = "上传成功!"; result.code = StatusCode.success; result.data = $"上传的文件大小为:{count}MB"; } } catch (Exception ex) { result.message = "上传异常,原因:" + ex.Message; } return result; } [HttpPost, Route("UpFile02")] public async Task
UpFileBymodel([FromForm] UpFileModel model) { ApiResult result = new ApiResult(); try { bool flag = await UpLoadFileStreamHelper.UploadWriteFileByModelAsync(model); result.code = flag ? StatusCode.success : StatusCode.fail; result.message = flag ? "上传成功" : "上传失败"; } catch (Exception ex) { result.message = "上传异常,原因:" + ex.Message; } return result; } [HttpPost, Route("UpFile03")] public async Task
UpFile03([FromForm] IFormFile file) { ApiResult result = new ApiResult(); try { bool flag = await UpLoadFileStreamHelper.UploadWriteFileAsync(file); result.code = flag ? StatusCode.success : StatusCode.fail; result.message = flag ? "上传成功" : "上传失败"; } catch (Exception ex) { result.message = "上传异常,原因:" + ex.Message; } return result; }}

2. 自定义的 JSON 配置文件

{  "upfileInfo": {    "uploadFilePath": "/Myupfiles/"  }}

3. 读取自定义的 JSON 文件

using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using Microsoft.Extensions.Configuration;using Microsoft.Extensions.Caching;namespace ZRFCoreTestMongoDB.Commoms{    public class AppJsonHelper    {        public static JwtConfigModel InitJsonModel()        {            string key = "key_myjsonfilekey";            JwtConfigModel cachemodel = SystemCacheHelper.GetByCache(key);            if (cachemodel == null)            {                ConfigurationBuilder builder = new ConfigurationBuilder();                var broot = builder.AddJsonFile("./configs/zrfjwt.json").Build();                cachemodel = broot.GetSection("jwtconfig").Get();                SystemCacheHelper.SetCacheByFile(key, cachemodel);            }            return cachemodel;        }        public static T GetJsonModelByFilePath
(string jsonName, string jsonFilePath) { if (!string.IsNullOrEmpty(jsonName)) { ConfigurationBuilder builder = new ConfigurationBuilder(); var broot = builder.AddJsonFile(jsonFilePath).Build(); T model = broot.GetSection(jsonName).Get(); return model; } return default; } }}

4. 上传文件的测试帮助类

using Microsoft.AspNetCore.Http;using Microsoft.AspNetCore.Mvc;using System.IO;using ZRFCoreTestMongoDB.Model;namespace ZRFCoreTestMongoDB.Commoms{    public class UpLoadFileStreamHelper    {        const int WRITE_FILE_SIZE = 1024 * 1024 * 2;        public static double UploadWriteFile(Stream stream, string path)        {            try            {                double writeCount = 0;                using (FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, WRITE_FILE_SIZE))                {                    Byte[] by = new byte[WRITE_FILE_SIZE];                    int readCount = 0;                    while ((readCount = stream.Read(by, 0, by.Length)) > 0)                    {                        fileStream.Write(by, 0, readCount);                        writeCount += readCount;                    }                    return Math.Round((writeCount * 1.0 / (1024 * 1024)), 2);                }            }            catch (Exception ex)            {                throw new Exception("发生异常:" + ex.Message);            }        }        public static async Task
UploadWriteFileAsync(Stream stream, string path) { try { double writeCount = 0; using (FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, WRITE_FILE_SIZE)) { Byte[] by = new byte[WRITE_FILE_SIZE]; int readCount = 0; while ((readCount = await stream.ReadAsync(by, 0, by.Length)) > 0) { await fileStream.WriteAsync(by, 0, readCount); writeCount += readCount; } } return Math.Round((writeCount * 1.0 / (1024 * 1024)), 2); } catch (Exception ex) { throw new Exception("发生异常:" + ex.Message); } } public static async Task
UploadWriteFileAsync(IFormFile file, string path) { try { using (FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, WRITE_FILE_SIZE)) { await file.CopyToAsync(fileStream); return true; } } catch (Exception ex) { throw new Exception("发生异常:" + ex.Message); } } public static async Task
UploadWriteFileByModelAsync(UpFileModel model) { try { var files = model.file.Files; if (files != null && files.Any()) { var file = files[0]; string contentType = file.ContentType; string fileOrginname = file.FileName; string fileExtention = Path.GetExtension(fileOrginname); string cdipath = Directory.GetCurrentDirectory(); string fileupName = Guid.NewGuid().ToString("d") + fileExtention; string upfilePath = Path.Combine(cdipath + "/myupfiles/", fileupName); if (!System.IO.File.Exists(upfilePath)) { using (var stream = System.IO.File.Create(upfilePath)) { } } using (FileStream fileStream = new FileStream(upfilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)) { using (Stream stream = file.OpenReadStream()) { await stream.CopyToAsync(fileStream); return true; } } } } catch (Exception ex) { throw new Exception("发生异常:" + ex.Message); } return false; } }

5. 全局大文件上传的使用

using System;using System.Collections.Generic;using System.Linq;using Microsoft.AspNetCore.Hosting;using Microsoft.Extensions.Configuration;using Microsoft.Extensions.Hosting;using Microsoft.Extensions.Logging;namespace CoreTestMongoDB{    public class Program    {        public static void Main(string[] args)        {            CreateHostBuilder(args).Build().Run();        }        public static IHostBuilder CreateHostBuilder(string[] args) =>            Host.CreateDefaultBuilder(args)                .ConfigureWebHostDefaults(webBuilder =>                {                    webBuilder.UseStartup(Startup.CreateDefaultBuilder);                    webBuilder.ConfigureKestrel(c =>                    {                        c.Limits.MaxRequestBodySize = 1024 * 1024 * 300;                    });                })                .UseServiceProviderFactory(new Autofac.Extensions.DependencyInjection.AutofacServiceProviderFactory());    }}

6. 上传成功的效果截图

通过以上实现,您可以轻松完成文件上传功能,支持多种文件上传方式,并通过自定义配置文件灵活配置上传路径和其他参数。

转载地址:http://mvqzz.baihongyu.com/

你可能感兴趣的文章