.netCore上传文件并读取文件的扩展名和文件大小

依旧基于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;

希望可以通过这篇文章能够给你提供帮助

  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值