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

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

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/

你可能感兴趣的文章
Objective-C实现LDPC码(附完整源码)
查看>>
Objective-C实现least common multiple最小公倍数算法(附完整源码)
查看>>
Objective-C实现Lempel-Ziv压缩算法(附完整源码)
查看>>
Objective-C实现Length conversion长度转换算法(附完整源码)
查看>>
Objective-C实现Levenshtein 距离算法(附完整源码)
查看>>
Objective-C实现levenshteinDistance字符串编辑距离算法(附完整源码)
查看>>
Objective-C实现lfu cache缓存算法(附完整源码)
查看>>
Objective-C实现LFU缓存算法(附完整源码)
查看>>
Objective-C实现linear algebra线性代数算法(附完整源码)
查看>>
Objective-C实现linear congruential generator线性同余发生器算法(附完整源码)
查看>>
Objective-C实现linear discriminant analysis线性判别分析算法(附完整源码)
查看>>
Objective-C实现linear regression线性回归算法(附完整源码)
查看>>
Objective-C实现linear search线性搜索算法(附完整源码)
查看>>
Objective-C实现Linear search线性搜索算法(附完整源码)
查看>>
Objective-C实现LinearSieve线性素数筛选算法 (附完整源码)
查看>>
Objective-C实现LinkedListNode链表节点类算法(附完整源码)
查看>>
Objective-C实现LinkedList链表算法(附完整源码)
查看>>
Objective-C实现local weighted learning局部加权学习算法(附完整源码)
查看>>
Objective-C实现logistic regression逻辑回归算法(附完整源码)
查看>>
Objective-C实现logistic sigmoid函数(附完整源码)
查看>>