刚刚做了个文件上传功能,拿来分享一下!(MVC架构及传统架构通用)
文件上传无论在软件还是在网站上都十分常见,我今天再把它拿出来,讲一下,主要讲一下它的设计思想和实现技术,为了它的通用性,我把它做在了WEB.Service项目里,即它是针对服务器的,它的结构是关联UI(WEB)层与Service层(BLL)的桥梁.
结构

上传基类:

上传文件的接口规范:

接口的实现:

UI层调用WEB.Service层的上传功能:(附代码)

public class FileUploadController : Controller
{
WEB.Services.IFileUpload iFileUpload = null;
public FileUploadController()
{
iFileUpload = new WEB.Services.FileUpload();
}
#region 文件上传
public ActionResult uploadheadpic()
{
return View();
}
[HttpPost]
public ActionResult uploadheadpic(FormCollection formcollection)
{
if (Request.Files.Count > 0)
{
HttpPostedFileBase file = Request.Files[0];
Entity.Commons.VMessage vm = iFileUpload.Image(WEB.Services.UpLoadType.DownloadUrl, file);
if (vm.IsComplete)
TempData["PicUrl"] = "{result:true,msg:\"" + vm[0].Replace("\"", "") + "\"}";
else
TempData["PicUrl"] = "{result:false,msg:\"" + vm[0].Replace("\"", "") + "\"}";
}
return View();
}
#endregion
}

下面公布一下上传的基类代码:(如果有设计不合理的地方,欢迎大家留言)

namespace WEB.Services
{
#region 所需枚举
/// <summary>
/// 文件上传类型
/// </summary>
public enum UpLoadType
{
/// <summary>
/// 下载地址
/// </summary>
DownloadUrl = 0,
/// <summary>
/// 文件地址
/// </summary>
FileUrl = 1,
}
/// <summary>
/// 上传错误信息列举
/// </summary>
public enum WarnEnum
{
ImgContentType,
ImgContentLength,
ImgExtension,
}
#endregion
#region 文件上传基本服务类
/// <summary>
/// 文件上传基本服务类
/// </summary>
public abstract class FileUploadBase
{
/// <summary>
/// 图片MIME
/// </summary>
protected static List<string> imgMIME = new List<string>
{
"application/x-zip-compressed",
"application/octet-stream",
"application/x-compressed",
"application/x-rar-compressed",
"application/zip",
"application/vnd.ms-excel",
"application/vnd.ms-powerpoint",
"application/msword",
"image/jpeg",
"image/gif",
"audio/x-mpeg",
"audio/x-wma",
"application/x-shockwave-flash",
"video/x-ms-wmv",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"application/vnd.openxmlformats-officedocument.presentationml.presentation",
};
/// <summary>
/// 验证消息字典
/// </summary>
protected static Dictionary<WarnEnum, string> msgDIC = new Dictionary<WarnEnum, string>
{
{WarnEnum.ImgContentType ,"只能上传指定类型的文件!" },
{WarnEnum.ImgContentLength ,"只能上传文件大小为{0}以下!" },
{WarnEnum.ImgExtension , "文件的扩展文件不正确"}
};
/// <summary>
/// 相对地址字典
/// </summary>
protected static Dictionary<UpLoadType, string> relativePathDic = new Dictionary<UpLoadType, string>
{
{UpLoadType.DownloadUrl ,@"DownLoad/" },
{UpLoadType.FileUrl ,@"FileUpload/" },
};
/// <summary>
/// 图片后缀
/// </summary>
protected static string[] imgExtension = { "xls", "doc", "zip", "rar", "ppt", "docx", "xlsx", "pptx",
"mp3", "wma", "swf", "jpg", "jpeg", "gif" };
}
#endregion
}

文件上传实现类:

public class FileUpload : FileUploadBase, IFileUpload
{
#region 文件上级WWW服务器及图像服务器
public Entity.Commons.VMessage Image(UpLoadType type, HttpPostedFileBase hpf)
{
HttpRequest Request = HttpContext.Current.Request;
Entity.Commons.VMessage vmsg = new Entity.Commons.VMessage();
if (this.IsIamgeVaild(type, hpf))
{
string relativePath = string.Format(VConfig.BaseConfigers.LocationUploadPath, relativePathDic[type]);
string path = HttpContext.Current.Server.MapPath(relativePath);
#region 建立路径
DirectoryInfo di = new DirectoryInfo(path);
if (!di.Exists)
{
di.Create();
}
#endregion
string guid = Guid.NewGuid().ToString();
string fileName = string.Format("{0}{1}", guid, new FileInfo(hpf.FileName).Extension);//上传文件的名称
hpf.SaveAs(string.Format("{0}{1}", path, fileName));
vmsg.Clear();
vmsg.AddItem(string.Format("{0}://{1}{2}{3}",
Request.Url.Scheme,
Request.Url.Authority,
relativePath.Replace('\\', '/'),
fileName
)
);
vmsg.AddItem(guid);
vmsg.IsComplete = true;
}
else
{
vmsg.AddItemRange(this.GetRuleViolations(type, hpf));
vmsg.IsComplete = false;
}
return vmsg;
}
public Entity.Commons.VMessage ImageToServer(string url)
{
Entity.Commons.VMessage vmsg = new Entity.Commons.VMessage();
Uri uri = new Uri(url);
string fileName = uri.Segments[uri.Segments.Length - 1];
string typeStr = uri.Segments[uri.Segments.Length - 2];
VCommons.Utils.FileUpLoad(
string.Format(BaseConfigers.DefaultUploadUri, typeStr.TrimEnd('/')),
HttpContext.Current.Server.MapPath(uri.LocalPath)
);
vmsg.IsComplete = true;
vmsg.AddItem(
string.Format("{0}://{1}/upload/{2}{3}",
HttpContext.Current.Request.Url.Scheme,
BaseConfigers.ImageServerHost,
typeStr,
fileName
)
);
return vmsg;
}
#endregion
#region 验证文件
internal bool IsIamgeVaild(UpLoadType type, HttpPostedFileBase hpf)
{
return this.GetRuleViolations(type, hpf).Count() == 0;
}
/// <summary>
/// 验证文件
/// </summary>
/// <param name="hpf"></param>
/// <returns></returns>
internal IEnumerable<string> GetRuleViolations(UpLoadType type, HttpPostedFileBase hpf)
{
if (!imgMIME.Contains(hpf.ContentType))// MIME
yield return msgDIC[WarnEnum.ImgContentType];
int contentLength = this.GetContentLengthByType(type);//文件大小
if (hpf.ContentLength > contentLength)
yield return string.Format(msgDIC[WarnEnum.ImgContentLength], contentLength / 1024);
if (!imgExtension.Contains(hpf.FileName.Substring(hpf.FileName.LastIndexOf('.') + 1)))//文件后缀
yield return msgDIC[WarnEnum.ImgExtension];
yield break;
}
#endregion
#region 根据 FileUpLoadContentLengthType 类型 获取相应的大小
/// <summary>
/// 根据 FileUpLoadContentLengthType 类型 获取相应的大小
/// </summary>
/// <param name="type">文件上传大小枚举值</param>
/// <returns>返回</returns>
int GetContentLengthByType(UpLoadType type)
{
switch (type)
{
case UpLoadType.DownloadUrl:
return 200000; //200M
case UpLoadType.FileUrl:
return 200000;
default:
throw new Exception("可能有错误");
}
}
#endregion
}
刚刚做了个文件上传功能,拿来分享一下!(MVC架构及传统架构通用)的更多相关文章
- MVC5:使用Ajax和HTML5实现文件上传功能
引言 在实际编程中,经常遇到实现文件上传并显示上传进度的功能,基于此目的,本文就为大家介绍不使用flash 或任何上传文件的插件来实现带有进度显示的文件上传功能. 基本功能:实现带有进度条的文件上传功 ...
- Spring 文件上传功能
本篇文章,我们要来做一个Spring的文件上传功能: 1. 创建一个Maven的web工程,然后配置pom.xml文件,增加依赖: <dependency> <groupId> ...
- Spring +SpringMVC 实现文件上传功能。。。
要实现Spring +SpringMVC 实现文件上传功能. 第一步:下载 第二步: 新建一个web项目导入Spring 和SpringMVC的jar包(在MyEclipse里有自动生成spring ...
- 用c++开发基于tcp协议的文件上传功能
用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学 ...
- nodejs 实现简单的文件上传功能
首先需要大家看一下目录结构,然后开始一点开始我们的小demo. 文件上传总计分为三种方式: 1.通过flash,activeX等第三方插件实现文件上传功能. 2.通过html的form标签实现文件上传 ...
- Android 实现文件上传功能(upload)
文 件上传在B/S应用中是一种十分常见的功能,那么在Android平台下是否可以实现像B/S那样的文件上传功能呢?答案是肯定的.下面是一个模拟网站程 序上传文件的例子.这里只写出了Android部分的 ...
- Springboot如何启用文件上传功能
网上的文章在写 "springboot文件上传" 时,都让你加上模版引擎,我只想说,我用不上,加模版引擎,你是觉得我脑子坏了,还是觉得我拿不动刀了. springboot如何启用文 ...
- PHPCMS_V9 模型字段添加单文件上传功能
后台有“多文件上传”功能,但是对于有些情况,我们只需要上传一个文件,而使用多文件上传功能上传一个文件,而调用时调用一个文件URL太麻烦了. 使用说明: 1.打开phpcms\modules\conte ...
- 配置php.ini实现PHP文件上传功能
本文介绍了如何配置php.ini实现PHP文件上传功能.其中涉及到php.ini配置文件中的upload_tmp_dir.upload_max_filesize.post_max_size等选项,这些 ...
随机推荐
- Linux的硬件时间、校正Linux系统时间及系统时间调用流程
第一部分: 一)概述: 事实上在Linux中有两个时钟系统,分别是系统时间和硬件时间 UTC是协调世界时(Universal Time Coordinated)英文缩写,它比北京时间早8个小时. ...
- tornado框架基础02-输入和输出
01 输出 write bytes类型 class IndexHandler(tornado.web.RequestHandler): def get(self): self.write(b'Torn ...
- LeetCode(65) Valid Number
题目 Validate if a given string is numeric. Some examples: "0" => true " 0.1 " ...
- RobotFramework:切换页面和Frame框架
切换页面主要有以下两种情况 在浏览器上打开多个窗口(Windows),在窗口内切换 打开多个浏览器(Browser),在多个浏览器内切换 1. 切换窗口 该操作适用于:打开两(多)个窗口页面,在打开的 ...
- java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver
今天这个问题排查了好大一会,开始网上有人这么说: https://www.cnblogs.com/rookiebob/p/3749396.html 但是仍未能解决我的问题, 最后发现是只在外层的pom ...
- Java实战及解析 — Maven快速入门
五分钟快速入门 mvn --version mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -Darche ...
- 【java基础 4】树形结构数据呈现的非递归算法(循环)实现
一.基本概况 上一篇博客介绍到用递归实现树结构数据的查找,那么这篇博客,我就结合自己对于树的理解,然后用一种非递归的方式进行树结构数据的处理.首先,改造数据库表设计,加入度的概念: 首先,layer的 ...
- UVA11090 Going in Cycle!! 【SPFA】
题意:求一个无向图的边权平均值最小的环 思路:假设环中Σwi/t<ans 那变形一下就是Σwi<ans*t → Σ(wi-ans)< 0 这样就可以二分答案做了 #include & ...
- Java设计模式之(设计模式的概述)
概述: 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发 ...
- jQuery的对象访问函数(get,index,size,each)
1.get() 元素集合 取得所有匹配的 DOM 元素集合. 这是取得所有匹配元素的一种向后兼容的方式(不同于jQuery对象,而实际上是元素数组). 如果你想要直接操作 DOM 对象而不是 jQue ...