依旧基于ABP框架实现的文件上传,这里我创建了一个文件记录表,用于记录上传文件的基本信息.
1.首先,这是我创建的文件记录表,用于每上传一个文件就记录一条数据。
/// <summary>
/// 上传文件
/// </summary>
public class UploadFile : FullAuditedAggregateRoot<int>, IMultiTenant
{
public Guid? TenantId { get; set; }
/// <summary>
/// 文件名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 内容类型
/// </summary>
public string ContentType { get; set; }
/// <summary>
/// 扩展名
/// </summary>
public string Extensions { get; set; }
/// <summary>
/// 文件路径
/// </summary>
public string Path { get; set; }
/// <summary>
/// 文件大小
/// </summary>
public long Size { get; set; }
/// <summary>
/// 缩略图
/// </summary>
public string SmallPic { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Remark { get; set; }
}
2.控制器调用
/// <summary>
/// 文件上传
/// </summary>
/// <param name="file"></param>
/// <param name="type"></param>
/// <returns></returns>
[HttpPost]
[Route("UploadFile")]
public async Task<UploadFileDto> UploadFile(IFormFile file, FileType type = FileType.全部)
{
return await _filesAppService.UploadFile(file, type);
}
3.service层对文件的处理,其中包含了一些私有方法 ,底下我会一一讲解
/// <summary>
/// 文件上传
/// </summary>
/// <param name="file"></param>
/// <param name="type"></param>
/// <returns></returns>
public async Task<UploadFileDto> UploadFile(IFormFile file, FileType type = FileType.全部)
{
string extensions = null;
CheckFile(file, out extensions, type);
//subDirectory = subDirectory ?? string.Empty;
//var target = Path.Combine(_webHostEnvironment.ContentRootPath, subDirectory);
//取文件名
var fullName = GetFullFileName(extensions, true);
var savePath = GetFileSavePath(fullName);
var dic = Path.GetDirectoryName(savePath);
if (!Directory.Exists(dic))
Directory.CreateDirectory(dic);
//写入文件
using (FileStream stream = File.Create(savePath))
{
await file.CopyToAsync(stream);
}
var dto = new CreateOrUpdateUploadFileDto()
{
Name = file.FileName,
ContentType = file.ContentType,
Extensions = extensions,
Size = file.Length,
Path = fullName
};
return await base.CreateAsync(dto);
}
获取完整的文件名
/// <summary>
/// 获取完整的文件名
/// </summary>
/// <param name="extensions"></param>
/// <param name="isByDate"></param>
/// <returns></returns>
private string GetFullFileName(string extensions, bool isByDate = true)
{
if (isByDate)
return $"{DateTime.Now.ToString("yyyyMMdd")}\\{DateTime.Now.ToString("HHmmssffff")}{extensions}";
else
return $"{DateTime.Now.ToString("yyyyMMddHHmmssffff")}{extensions}";
}
检查文件 (验证判断)
/// <summary>
/// 检查文件
/// </summary>
/// <param name="file"></param>
/// <param name="fileExtensions"></param>
/// <param name="type"></param>
/// <exception cref="UserFriendlyException"></exception>
private void CheckFile([NotNull] IFormFile file, out string fileExtensions, FileType type = FileType.全部)
{
fileExtensions = Path.GetExtension(file.FileName);
var extensions = GetFileExtension(type);
if (!extensions.Contains(fileExtensions, StringComparer.OrdinalIgnoreCase))
{
throw new UserFriendlyException("上传类型支持:" + string.Join('\\', extensions));
}
if (file.Length > MaxFileSize)
{
throw new UserFriendlyException($"上传文件不可超过:{MaxFileSize / 1024}kb");
}
}
获取文件扩展名 FileType是枚举类型的文件类型
/// <summary>
/// 获取文件扩展名
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
private string[] GetFileExtension(FileType type)
{
var doc = new string[] { ".doc", ".docx", ".xls", ".xlsx", ".pdf" };
var pic = new string[] { ".jpg", ".gif", ".png" };
var file = new string[] { ".rar", ".zip", ".7z",".mp3" };
var vido = new string[] { ".mp4" };
switch (type)
{
case FileType.文档:
return doc;
case FileType.图片:
return pic;
case FileType.文件:
case FileType.视频:
return vido;
return file;
case FileType.全部:
return doc.Concat(pic).Concat(file).Concat(vido).ToArray();
default:
return new string[] { };
}
}
public enum FileType
{
文档,
图片,
文件,
全部,
音频,
视频
}
获取存储路径
/// <summary>
/// 获取存储路径
/// </summary>
/// <returns></returns>
internal string GetSaveDirectory()
{
if (_saveDirectory != string.Empty)
return _saveDirectory;
var dic = Directory.GetParent(AppContext.BaseDirectory)?.Parent;
if (dic != null)
_saveDirectory = Path.Combine(dic.FullName, "Attachment");
return _saveDirectory;
}
获取文件保存路径
/// <summary>
/// 获取文件保存路径
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public string GetFileSavePath(string filePath)
{
return Path.Combine(GetSaveDirectory(), filePath);
}
用到的一些公共字段和引用
using JetBrains.Annotations;
using JingGong.Abp.MES.Dto;
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Users;
using Xhznl.FileManagement.Files;
using static System.Net.WebRequestMethods;
using File = System.IO.File;
using Volo.Abp.ObjectMapping;
using Volo.Abp.Application.Services;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Identity;
using System.Net.Http;
using System.Net;
using System.Web;
using Microsoft.AspNetCore.Mvc;
using JingGong.Abp.Common;
using JingGong.Abp.Enums;
using System.Configuration;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
/// <summary>
/// 文件大小
/// </summary>
protected int MaxFileSize { set; get; } = 1024 * 1024 * 100;
希望可以通过这篇文章能够给你提供帮助