.Net和.NetCore WebAPI批量上传文件以及文件操作(支持模糊匹配)
1.Net
/// <summary>
/// 上传文件
/// </summary>
/// <returns></returns>
[HttpPost]
public JsonResult ExportFile()
{
UploadFile _uploadFile = new UploadFile();
try
{
var file = Request.Files[0]; //获取选中文件
string fileNameEx = Path.GetExtension(file.FileName);//获取扩展名
string fileNameTrue = Path.GetFileNameWithoutExtension(file.FileName);// 获取文件名不含扩展名
string imgType = Configs.GetValue("ImgType").ToUpper();
if (file == null || string.IsNullOrEmpty(file.FileName) || file.ContentLength == 0)
{
_uploadFile.code = -1;
_uploadFile.data = new { src = "" };
_uploadFile.msg = "上传出错!未检测到文件";
return Json(_uploadFile);
}
if (!imgType.Contains(fileNameEx.ToUpper().Replace(".", "")))
{
_uploadFile.code = -1;
_uploadFile.data = new { src = "" };
_uploadFile.msg = "上传出错!图片格式只支持"+ imgType;
return Json(_uploadFile);
}
string filePathName = string.Empty;
//定义本地路径位置
string localPath = Server.MapPath("~/Upload/ArticleUploadImg/");
string tmpName = Server.MapPath("~/Upload/ArticleUploadImg/");
var tmp = file.FileName;
var tmpIndex = 0;
//判断是否存在相同文件名的文件 相同累加1继续判断
while (System.IO.File.Exists(tmpName + tmp))
{
tmp = fileNameTrue + "_" + ++tmpIndex + fileNameEx;
}
//不带路径的最终文件名
filePathName = tmp;
if (!Directory.Exists(localPath))
Directory.CreateDirectory(localPath);
file.SaveAs(Path.Combine(tmpName, filePathName)); //保存图片(文件夹)
_uploadFile.code = 0;
_uploadFile.data = new { src = Path.Combine("/Upload/ArticleUploadImg/", filePathName), title = Path.GetFileNameWithoutExtension(filePathName) };
_uploadFile.msg = "上传成功";
return Json(_uploadFile);
}
catch (Exception ex)
{
return Json(_uploadFile, JsonRequestBehavior.AllowGet);
}
}
2. NetCore
/// <summary>
/// 文件上传
/// </summary>
/// <returns></returns>
[HttpPost, Route("attachment/Upload")]
public IHttpResponseResult UploadFile()
{
const string logName = "UploadFile";
try
{
var files = HttpContext.Current.Request.Files; //接收
if (files.Count <= 0) return Fail(logName, "未获取到文件");
for (var i = 0; i < files.Count; i++)
{
var file = files[i];
if (file == null) continue;
if (file.ContentLength > 1024 * 1024 * 5)
{
return Fail(logName, $"文件({file.FileName})大小超过5M", ErrorCode.FileTooLarge);
}
}
var fileFolderId = Guid.NewGuid(); //重命名
for (var i = 0; i < files.Count; i++)
{
var file = files[i];
if (file == null) continue;
var ext = Path.GetExtension(file.FileName).Replace(".", ""); //文件后缀名
//判断是否是运行上传的图片格式
if (Array.IndexOf(AppConfigs.FileType.Split('|'), ext) == -1)
{
return Fail(logName, $"({file.FileName})文件类型不支持", ErrorCode.FileTypeNotSupport);
}
var fileFolderPath = $"{HostingEnvironment.MapPath("/")}{AttachmentsBasePath}/{fileFolderId}/"; //重命名
if (!Directory.Exists(fileFolderPath))
{
Directory.CreateDirectory(fileFolderPath);
}
var filePath = Path.Combine(fileFolderPath, file.FileName);
file.SaveAs(filePath); //保存文件
}
return Success(logName, fileFolderId, "文件上传成功");
}
catch (Exception ex)
{
return Fail(logName, $"上传文件异常\n{ex.ToExceptionString()}");
}
}
3.文件操作
///<summary>
/// 文件操作帮助类
/// </summary>
public static class FileHelper
{
/// <summary>
/// 根目录
/// </summary>
private static readonly string RootPath = AppDomain.CurrentDomain.BaseDirectory;
/// <summary>
/// 读取文件夹下的文件
/// </summary>
/// <param name="fileFolderName">文件夹名称</param>
/// <param name="path">根目录下的相对路径</param>
/// <returns></returns>
public static Dictionary<string, byte[]> ReadBatchFile(string fileFolderName, string path)
{
var fileDic = new Dictionary<string, byte[]>();
var fileFolderPath = GetFolderPath(fileFolderName, path);
if (fileFolderPath.IsNullOrEmpty())
{
return fileDic;
}
var filesPath = GetAllFiles(fileFolderPath);
foreach (var filePath in filesPath)
{
var fileName = filePath.Split('\\').Last();
fileDic.Add(fileName, File.ReadAllBytes(filePath));
}
return fileDic;
}
/// <summary>
/// 删除文件夹
/// </summary>
/// <param name="fileFolderName">文件夹名称</param>
/// <param name="path">根目录下的相对路径</param>
/// <returns></returns>
public static void DeleteDirectory(string fileFolderName, string path)
{
var fileFolderPath = GetFolderPath(fileFolderName, path);
if (fileFolderPath.IsNullOrEmpty()) return;
//先删除目录下的所有文件
var filesPath = GetAllFiles(fileFolderPath);
foreach (var filePath in filesPath)
{
File.Delete(filePath);
}
//再删除目录
Directory.Delete(fileFolderPath);
}
/// <summary>
/// 根据文件夹的相对路径获取绝对路径
/// </summary>
/// <param name="fileFolderName">文件夹名称</param>
/// <param name="path">根目录下的相对路径</param>
/// <returns></returns>
private static string GetFolderPath(string fileFolderName, string path)
{
return Directory.GetDirectories($"{RootPath}/{path}", fileFolderName,
SearchOption.TopDirectoryOnly).FirstOrDefault();
}
/// <summary>
/// 获取文件路径下的所有文件
/// </summary>
/// <param name="fileFolderPath"></param>
/// <returns></returns>
private static IEnumerable<string> GetAllFiles(string fileFolderPath)
{
return Directory.GetFiles(fileFolderPath, "*");
}
/// <summary>
/// 读取单个文件
/// </summary>
/// <param name="fileName"></param>
/// <param name="path"></param>
/// <returns></returns>
public static byte[] ReadSingleFile(string fileName, string path)
{
var filePath = GetExactFilePath(fileName, path);
return filePath.IsNullOrEmpty() ? null : File.ReadAllBytes(filePath);
}
/// <summary>
/// 精确获取文件绝对路径(需要后缀名)
/// </summary>
/// <param name="fileName">文件名.后缀名</param>
/// <param name="path">相对路径</param>
/// <returns></returns>
private static string GetExactFilePath(string fileName, string path)
{
return Directory.GetFiles($"{RootPath}/{path}", fileName, SearchOption.AllDirectories).FirstOrDefault();
}
/// <summary>
/// 删除文件
/// </summary>
/// <param name="fileName">文件名称</param>
/// <param name="path">根目录下的相对路径</param>
/// <returns></returns>
public static void DeleteFile(string fileName, string path)
{
var filePath = GetExactFilePath(fileName, path);
if (!filePath.IsNullOrEmpty()) File.Delete(filePath);
}
/// <summary>
/// 根据文件名片段模糊匹配获取文件路径
/// </summary>
/// <param name="fileName">文件名片段</param>
/// <param name="path">相对路径</param>
/// <returns></returns>
public static string[] GetFuzzyFilePath(string fileName, string path)
{
return Directory.GetFiles($"{RootPath}/{path}", $"*{fileName}*.*", SearchOption.AllDirectories);
}
}
.Net和.NetCore WebAPI批量上传文件以及文件操作(支持模糊匹配)的更多相关文章
- linux ftp批量上传和下载文件
一.登录ftp 输入 ftp 192.168.1.111 输入用户名:ftpuser 输入密码:aaa123 二.转到目标目录 输入:cd test ----test为文件夹 三.批量上传 输 ...
- D365,实现批量上传和下载文件的工具
这里演示下批量上传文件到D365的小程序工具,下载功能也是一样的思路跟逻辑. 通过文件名的前缀跟各个主档表的主键进行绑定来决定将附件挂在哪里. 1.上传界面. 2.查看附件上传结果.
- 利用uploadify+asp.net 实现大文件批量上传。
前言 现在网上文件上传组件随便一搜都是一大堆,不过看大家一般都在用uploadify这个来上传文件.由于项目需要,我在来试了一下.因为第一次使用,也遇到了很多问题,特此记录! ------------ ...
- uploadify文件批量上传
uploadify能够时间文件的批量上传,JS文件包下载地址,使用说明可以参考官网文档(http://www.uploadify.com/documentation/) 使用方法如下代码: $(&qu ...
- 基于jQuery很牛X的批量上传插件
上传功能应该是每个网站必备的工具之一,因此出现了出现了很多各式各样的上传插件! 本文基于个人经验和使用从插件的:交互体验,易用性,文档,美观度出发,为大家推荐三款很NX的批量上传插件! 下面三款插件的 ...
- ASP.NET MVC WebAPI实现文件批量上传
工作中学习,学习中记录~~~~~~ 最下面附上demo 任务需求:需要做一个apI接口让C#的程序调用实现批量文件的上传. 难度: 没有做过通过API上传文件的...之前做过网站前后台上传. 首先当然 ...
- .net core版 文件上传/ 支持批量上传,拖拽以及预览,bootstrap fileinput上传文件
asp.net mvc请移步 mvc文件上传支持批量上传,拖拽以及预览,文件内容校验 本篇内容主要解决.net core中文件上传的问题 开发环境:ubuntu+vscode 1.导入所需要的包:n ...
- 文件批量上传-统一附件管理器-在线预览文件(有互联网和没有两种)--SNF快速开发平台3.0
实际上在SNF里使用附件管理是非常简单的事情,一句代码就可以搞定.但我也要在这里记录一下统一附件管理器能满足的需求. 通用的附件管理,不要重复开发,调用尽量简洁. 批量文件上传,并对每个文件大小限制, ...
- antd 批量上传文件逻辑
基本步骤 通过 antd 框架的 Upload 控件,采用手动上传的方式,先选择需要上传的文件(控制文件数量以及大小),再根据所选的文件列表,循环上传,期间通过 Spin 控件提示上传中. 效果展示 ...
- 带进度条的文件批量上传插件uploadify
有时项目中需要一个文件批量上传功能时,个人认为uploadify是快速简便的解决方案. 先上效果图: 一. 下载uploadify 从官网下载uploadify的Flash版本(Flash版本免费,另 ...
随机推荐
- 基于SqlSugar的开发框架循序渐进介绍(22)-- Vue3+TypeScript的前端工作流模块中实现统一的表单编辑和表单详情查看处理
在工作流页面中,除了特定的业务表单信息外,往往也需要同时展示通用申请单的相关信息,因此在页面设计的时候需要使用一些组件化的概念来实现动态的内容展示处理,本篇随笔介绍Vue3+TypeScript+El ...
- 1 c++编程基础
重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦! 生命就像一朵花,要拼尽全力绽放!死磕自个儿,身心愉悦! 1 c++揭开面纱 1.1 编程 ...
- 微信小程序根据开发环境切换域名
domain.js // 获取当前账号信息,线上小程序版本号仅支持在正式版小程序中获取,开发版和体验版中无法获取. // envVersion:'develop','trial','release' ...
- 第2-4-7章 docker安装WorkBench-规则引擎Drools-业务规则管理系统-组件化-中台
目录 8. WorkBench 8.1 WorkBench简介 8.2 安装方式 8.2.1 传统方式安装 8.2.2 docker安装drools workbench 8.3 使用方式 8.3.1 ...
- 【Java SE进阶】Day07 等待与唤醒案例、线程池、Lamdba表达式
一.等待唤醒机制 1.线程间通信 多个线程处理同一个资源,就存在线程通信问题(线程间存在竞争与协作机制) 为什么处理:为了 保证多个线程有规律地完成同一任务 如何处理:避免对共享变量争夺,需要等待唤醒 ...
- 用最少的代码打造一个Mini版的gRPC框架
在<用最少的代码模拟gRPC四种消息交换模式>中,我使用很简单的代码模拟了gRPC四种消息交换模式(Unary.Client Streaming.Server Streaming和Dupl ...
- CKA考试经验:报考和考纲
1 报考相关 1.有效期一年.在一年内需要定好考试的时间. 2.提前15分钟进入考试系统, 提前进入考试系统后并不是立马开始考试,而是预留给考官时间考察你的考试环境 3.考试时间 ,注意报考的Time ...
- 深入理解 Python 的对象拷贝和内存布局
深入理解 Python 的对象拷贝和内存布局 前言 在本篇文章当中主要给大家介绍 python 当中的拷贝问题,话不多说我们直接看代码,你知道下面一些程序片段的输出结果吗? a = [1, 2, 3, ...
- CH9120/CH9121 WCH-ETH透传芯片(持续更新)
网络变压器中心抽头: 如果使用网络变压器,变压器的中心抽头需要看PHY芯片时电流型还是电压型. 如果是电压型,则需要通过一个电容直接接到GND. 如果时电流型的PHY,那么就需要根据PHY芯片来看,从 ...
- [常用工具] OpenCV获取网络摄像头实时视频流
所需要硬件及软件环境: python 3/OpenCV3.4 or C++11/OpenCV3.4 1 RTSP协议 RTSP (Real Time Streaming Protocol),是一种语法 ...