ASP.NET实现的简单易用文件上传类
发布时间:2020-05-27 10:51:00 所属栏目:asp.Net 来源:互联网
导读:调用方法:UploadFileuf=newUploadFile();/*可选参数*/uf.SetIsUseOldFileName(true);//是否使用原始文件名作为新文件的文件名(默认:true),true原始文件名,false系统生成新文件名
|
调用方法:
UploadFile uf = new UploadFile();
/*可选参数*/
uf.SetIsUSEOldFileName(true);//是否使用原始文件名作为新文件的文件名(默认:true),true原始文件名,false系统生成新文件名
uf.SetFileDirectory(Server.MapPath("/file/temp3/"));//文件保存路径(默认:/upload)
uf.SetFileType("*");//允许上传的文件类型,逗号分割,必须全部小写! *表示所有 (默认值: .pdf,.xls,.xlsx,.doc,.docx,.txt,.png,.jpg,.gif )
uf.SetIsRenameSameFile(false);//重命名同名文件?
//文件以时间分目录保存
var message = uf.Save(Request.Files["Fileupload1"]); // “/file/temp3/2015/4/xx.jpg”
//文件以编号分目录保存
var message2 = uf.Save(Request.Files["Fileupload1"],"001" /*编号*/); // “/file/temp3/001/xx.jpg”
//返回信息
var isError = message.Error;//判段是否上传成功
var webPath = message.WebFilePath;//返回web路径
var msg = message.Message;//返回上传信息
var filePath = message.FilePath;//反回文件路径
var isSuccess = message.Error == false;
代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Hosting;
namespace SyntacticSugar
{
/// <summary>
/// ** 描述:单文件上传类 (暂时不支持多文件上传)
/// ** 创始时间:2015-5-27
/// ** 修改时间:-
/// ** 作者:sunkaixuan
/// </summary>
public class UploadFile
{
private ParamsModel Params;
public UploadFile()
{
Params = new ParamsModel()
{
FileDirectory = "/upload",FileType = ".pdf,.gif",MaxSizeM = 10,PathSaveType = PathSaveType.dateTimeNow,IsRenameSameFile=true
};
}
/// <summary>
/// 文件保存路径(默认:/upload)
/// </summary>
public void SetFileDirectory(string fileDirectory)
{
if (fileDirectory == null)
{
throw new ArgumentNullException("fileDirectory");
}
var isMapPath = Regex.IsMatch(fileDirectory,@"[a-z]:",RegexOptions.IgnoreCase);
if (isMapPath)
{
fileDirectory = GetRelativePath(fileDirectory);
}
Params.FileDirectory = fileDirectory;
}
/// <summary>
/// 是否使用原始文件名作为新文件的文件名(默认:true)
/// </summary>
/// <param name="isUSEOldFileName">true原始文件名,false系统生成新文件名</param>
public void SetIsUSEOldFileName(bool isUSEOldFileName)
{
Params.IsUSEOldFileName = isUSEOldFileName;
}
/// <summary>
/// 允许上传的文件类型,.gif )
/// </summary>
public void SetFileType(string fileType)
{
Params.FileType = fileType;
}
/// <summary>
/// 允许上传多少大小(单位:M)
/// </summary>
public void SetMaxSizeM(double maxSizeM)
{
Params.MaxSizeM = maxSizeM;
}
/// <summary>
/// 重命名同名文件?
/// </summary>
/// <param name="isRenameSameFile">true:重命名,false覆盖</param>
public void SetIsRenameSameFile(bool isRenameSameFile)
{
Params.IsRenameSameFile = isRenameSameFile;
}
/// <summary>
/// 保存表单文件
/// </summary>
/// <param name="postFile">HttpPostedFile</param>
/// <returns></returns>
public ResponseMessage Save(HttpPostedFile postFile)
{
return CommonSave(postFile);
}
/// <summary>
/// 保存表单文件,根据编号创建子文件夹
/// </summary>
/// <param name="postFile">HttpPostedFile</param>
/// <param name="number">编号</param>
/// <returns></returns>
public ResponseMessage Save(HttpPostedFile postFile,string number)
{
Params.PathSaveType = PathSaveType.code;
_Number = number;
return CommonSave(postFile);
}
/// <summary>
/// 保存表单文件,根据HttpPostedFile
/// </summary>
/// <param name="postFile">HttpPostedFile</param>
/// <param name="isRenameSameFile">值为true 同名文件进行重命名,false覆盖原有文件</param>
/// <param name="fileName">新的文件名</param>
/// <returns></returns>
private ResponseMessage CommonSave(HttpPostedFile postFile)
{
ResponseMessage reval = new ResponseMessage();
try
{
if (postFile == null || postFile.ContentLength == 0)
{
TryError(reval,"没有文件!");
return reval;
}
//文件名
string fileName = Params.IsUSEOldFileName ? postFile.FileName : DateTime.Now.ToString("yyyyMMddhhmmssms") + Path.GetExtension(postFile.FileName);
//验证格式
this.CheckingType(reval,postFile.FileName);
//验证大小
this.CheckSize(reval,postFile);
if (reval.Error) return reval;
string webDir = string.Empty;
// 获取存储目录
var directory = this.GetDirectory(ref webDir);
var filePath = directory + fileName;
if (System.IO.File.Exists(filePath))
{
if (Params.IsRenameSameFile)
{
filePath = directory + DateTime.Now.ToString("yyyyMMddhhssms") + "-" + fileName;
}
else
{
System.IO.File.Delete(filePath);
}
}
// 保存文件
postFile.SaveAs(filePath);
reval.FilePath = filePath;
reval.FilePath = webDir + fileName;
reval.FileName = fileName;
reval.WebFilePath = webDir + fileName;
return reval;
}
catch (Exception ex)
{
TryError(reval,ex.Message);
return reval;
}
}
private void CheckSize(ResponseMessage message,HttpPostedFile PostFile)
{
if (PostFile.ContentLength / 1024.0 / 1024.0 > Params.MaxSizeM)
{
TryError(message,string.Format("对不起上传文件过大,不能超过{0}M!",Params.MaxSizeM));
}
}
/// <summary>
/// 根据物理路径获取相对路径
/// </summary>
/// <param name="fileDirectory"></param>
/// <param name="sever"></param>
/// <returns></returns>
private static string GetRelativePath(string fileDirectory)
{
var sever = HttpContext.Current.Server;
fileDirectory = "/" + fileDirectory.Replace(sever.MapPath("~/"),"").TrimStart('/').Replace('','/');
return fileDirectory;
}
/// <summary>
/// 获取目录
/// </summary>
/// <returns></returns>
private string GetDirectory(ref string webDir)
{
var sever = HttpContext.Current.Server;
// 存储目录
string directory = Params.FileDirectory;
// 目录格式
string childDirectory = DateTime.Now.ToString("yyyy-MM/dd");
if (Params.PathSaveType == PathSaveType.code)
{
childDirectory = _Number;
}
webDir = directory.TrimEnd('/') + "/" + childDirectory + '/';
string dir = sever.MapPath(webDir);
// 创建目录
if (Directory.Exists(dir) == false)
Directory.CreateDirectory(dir);
return dir;
}
/// <summary>
/// 验证文件类型)
/// </summary>
/// <param name="fileName"></param>
private void CheckingType(ResponseMessage message,string fileName)
{
if (Params.FileType != "*")
{
// 获取允许允许上传类型列表
string[] typeList = Params.FileType.Split(',');
// 获取上传文件类型(小写)
string type = Path.GetExtension(fileName).ToLowerInvariant(); ;
// 验证类型
if (typeList.Contains(type) == false)
this.TryError(message,"文件类型非法!");
}
}
/// <summary>
/// 抛出错误
/// </summary>
/// <param name="Msg"></param>
private void TryError(ResponseMessage message,string msg)
{
message.Error = true;
message.Message = msg;
}
#region models
private class ParamsModel
{
/// <summary>
/// 文件保存路径
/// </summary>
public string FileDirectory { get; set; }
/// <summary>
/// 允许上传的文件类型,必须全部小写!
/// </summary>
public string FileType { get; set; }
/// <summary>
/// 允许上传多少大小
/// </summary>
public double MaxSizeM { get; set; }
/// <summary>
/// 路径存储类型
/// </summary>
public PathSaveType PathSaveType { get; set; }
/// <summary>
/// 重命名同名文件?
/// </summary>
public bool IsRenameSameFile { get; set; }
/// <summary>
/// 是否使用原始文件名
/// </summary>
public bool IsUSEOldFileName { get; set; }
}
/// <summary>
/// 路径存储类型
/// </summary>
public enum PathSaveType
{
/// <summary>
/// 根据时间创建存储目录
/// </summary>
dateTimeNow = 0,/// <summary>
/// 根据ID编号方式来创建存储目录
/// </summary>
code = 1
}
private string _Number { get; set; }
/// <summary>
/// 反回信息
/// </summary>
public class ResponseMessage
{
/// <summary>
/// 上传错误
/// </summary>
public bool Error { get; set; }
/// <summary>
/// 消息
/// </summary>
public string Message { get; set; }
/// <summary>
/// 文件路径
/// </summary>
public string FilePath { get; set; }
/// <summary>
/// 网站路径
/// </summary>
public string WebFilePath { get; set; }
/// <summary>
/// 获取文件名
/// </summary>
public string FileName { get; set; }
}
#endregion
}
}
(编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 如何在ASP.NET Core 2.0中设置多个身份验证方案?
- 在ASP.Net中获取会话ID
- asp.net – global.asax Application_Error不触发
- asp.net-mvc – 不要在ASP .NET MVC 4 BundleConfig中缩小某
- asp.net-mvc – 如何在运行时之前编译cshtml
- asp.net – 哪里是.ASPXAUTH cookie
- asp.net-mvc – ASP.NET MVC Web API缓存控制头部没有发送响
- asp.net-mvc – 数据模型需要两个属性之一
- 如何使我的ASP.NET服务器控件将嵌入式代码块作为属性值?
- asp.net-mvc-3 – 在MVC 3视图模型上使用Editable属性
推荐文章
站长推荐
- asp.net – 当内容页面位于子文件夹中时,jQuery无
- iis-7 – 经典ASP站点请求在IIS7中随机挂起
- asp.net – 无法加载程序集“App_Web_kh7-x3ka”
- asp.net-mvc – 是否可以使用RedirectToAction清
- 当将单字节添加到响应中时,ASP.NET WebAPI输出的
- asp.net – 为什么IIS中的Windows /集成身份验证
- asp.net – 请求标头的大小太长
- asp.net-mvc – 如何在mvc4中的特定视图中添加单
- 过期输出缓存ASP.Net MVC
- asp.net – Page.Request.UserHostAddress的格式
热点阅读
