提示:以下是本篇文章正文内容,下面案例可供参考
一、控制器
/// <summary>
/// 批量上传文件接口
/// <para>客户端文本框需设置name='files'</para>
/// </summary>
/// <param name="files"></param>
/// <returns>服务器存储的文件信息</returns>
[HttpPost]
public Response<IList<UploadFile>> Upload(IFormFileCollection files)
{
var result = new Response<IList<UploadFile>>();
try
{
result.Result = _app.Add(files);
}
catch (Exception ex)
{
result.Code = 500;
result.Message = ex.Message;
}
return result;
}
二、类
1.app类
代码如下(示例):
private string _filePath??AppContext.BaseDirectory;
private string _dbFilePath; //数据库中的文件路径
private string _dbThumbnail; //数据库中的缩略图路径
/// <summary>
/// 批量添加附件
/// </summary>
/// <param name="files"></param>
/// <returns></returns>
public List<UploadFile> Add(IFormFileCollection files)
{
if (!_auth.CheckLogin())
{
throw new Exception("必需登录才能上传附件");
}
var result = new List<UploadFile>();
foreach (var file in files)
{
result.Add(Add(file));
}
return result;
}
public UploadFile Add(IFormFile file)
{
if (file != null)
{
_logger.LogInformation("收到新文件: " + file.FileName);
_logger.LogInformation("收到新文件: " + file.Length);
}
else
{
_logger.LogWarning("收到新文件为空");
}
if (file != null && file.Length > 0 && file.Length < 10485760)
{
using (var binaryReader = new BinaryReader(file.OpenReadStream()))
{
var fileName = Path.GetFileName(file.FileName);
var data = binaryReader.ReadBytes((int) file.Length);
SaveFile(fileName, data);
var filedb = new UploadFile
{
FilePath = _dbFilePath,
Thumbnail = _dbThumbnail,
FileName = fileName,
FileSize = file.Length.ToInt(),
CreateUserName = _auth.GetUserName(),
FileType = Path.GetExtension(fileName),
Extension = Path.GetExtension(fileName)
};
Repository.Add(filedb); //保存到数据库的方法,自己的
return filedb;
}
}
else
{
throw new Exception("文件过大");
}
}
/// <summary>
/// 存储文件,如果是图片文件则生成缩略图
/// </summary>
/// <param name="fileName"></param>
/// <param name="fileBuffers"></param>
/// <exception cref="Exception"></exception>
private void SaveFile(string fileName, byte[] fileBuffers)
{
string folder = DateTime.Now.ToString("yyyyMMdd");
//判断文件是否为空
if (string.IsNullOrEmpty(fileName))
{
throw new Exception("文件名不能为空");
}
//判断文件是否为空
if (fileBuffers.Length < 1)
{
throw new Exception("文件不能为空");
}
var uploadPath = Path.Combine(_filePath, folder);
_logger.LogInformation("文件写入:" + uploadPath);
if (!Directory.Exists(uploadPath))
{
Directory.CreateDirectory(uploadPath);
}
var ext = Path.GetExtension(fileName).ToLower();
string newName = GenerateId.GenerateOrderNumber() + ext;
using (var fs = new FileStream(Path.Combine(uploadPath, newName), FileMode.Create))
{
fs.Write(fileBuffers, 0, fileBuffers.Length);
fs.Close();
//生成缩略图
if (ext.Contains(".jpg") || ext.Contains(".jpeg") || ext.Contains(".png") || ext.Contains(".bmp") ||
ext.Contains(".gif"))
{
string thumbnailName = GenerateId.GenerateOrderNumber() + ext;
ImgHelper.MakeThumbnail(Path.Combine(uploadPath, newName), Path.Combine(uploadPath, thumbnailName));
_dbThumbnail = Path.Combine(folder, thumbnailName);
}
_dbFilePath = Path.Combine(folder, newName);
}
}
/// <summary>
/// 唯一订单号生成
/// </summary>
/// <returns></returns>
public static string GenerateOrderNumber()
{
string strDateTimeNumber = DateTime.Now.ToString("yyyyMMddHHmmssffff");
string strRandomResult = NextRandom(1000, 1).ToString("0000");
return strDateTimeNumber + strRandomResult;
}
/// <summary>
/// 参考:msdn上的RNGCryptoServiceProvider例子
/// </summary>
/// <param name="numSeeds"></param>
/// <param name="length"></param>
/// <returns></returns>
private static int NextRandom(int numSeeds, int length)
{
// Create a byte array to hold the random value.
byte[] randomNumber = new byte[length];
// Create a new instance of the RNGCryptoServiceProvider.
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
// Fill the array with a random value.
rng.GetBytes(randomNumber);
// Convert the byte to an uint value to make the modulus operation easier.
uint randomResult = 0x0;
for (int i = 0; i < length; i++)
{
randomResult |= ((uint) randomNumber[i] << ((length - 1 - i)*8));
}
return (int) (randomResult%numSeeds) + 1;
}
// <summary>生成缩略图</summary>
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
namespace Infrastructure.Helpers
{
public class ImgHelper
{
/// <summary>
/// 根据已有图片生成缩略图
/// <para>用法:MakeThumbnail(path, tpath, 120, 90, "H");</para>
/// </summary>
/// <param name="originalImagePath">源图片路径</param>
/// <param name="thumbnailPath">缩略图保存路径</param>
/// <param name="width">缩略图的宽度</param>
/// <param name="height">缩略图高度</param>
/// <param name="mode">缩略模式:H:指定高度,宽度按比例处理;W:指定宽度,高度按比例处理;HW按参数指定的高度和宽度</param>
public static void MakeThumbnail(string originalImagePath,
string thumbnailPath,
int width = 120, int height = 90, string mode = "H")
{
using (var originalImage = Image.Load(originalImagePath))
{
int towidth = width; //缩略图宽度
int toheight = height; //缩略图高度
switch (mode)
{
case "HW": //指定高宽缩放(可能变形)
break;
case "W": //指定宽,高按比例
toheight = originalImage.Height * width / originalImage.Width;
break;
case "H": //指定高,宽按比例
towidth = originalImage.Width * height / originalImage.Height;
break;
default:
break;
}
originalImage.Mutate(x => x.Resize(towidth, toheight));
originalImage.Save(thumbnailPath);
}
}
}
}
总结
参考:https://github.com/yubaolee/OpenAuth.Core
其他返回类,根据自己情况而定