ASP.NET 文件上传类 简单好用
调用:
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,.xls,.xlsx,.doc,.docx,.txt,.png,.jpg,.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>
/// 允许上传的文件类型, 逗号分割,必须全部小写! *表示所有 (默认值: .pdf,.xls,.xlsx,.doc,.docx,.txt,.png,.jpg,.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 文件上传类 简单好用的更多相关文章
- asp.net 文件上传示例整理
ASP.NET依托.net framework类库,封装了大量的功能,使得上传文件非常简单,主要有以下三种基本方法. 方法一:用Web控件FileUpload,上传到网站根目录. 代码如下 复制代码 ...
- ASP无惧上传类不能上传中文双引号文件及ASP函数InStr存在bug
ASP无惧上传类不能上传中文双引号文件及ASP函数InStr存在bug 近日发现eWebEditor V2.8 asp 版本上传文件文件名不能包含中文双引号,发现eWebEditor使用ASP“无惧上 ...
- Cookie操作、ASP.Net文件上传HttpPostedFile
概述 Cookie用来保存客户浏览器请求服务器页面的请求信息. 我们可以存放非敏感的用户信息,保存时间可以根据需要设置.如果没有设置Cookie失效日期,它的生命周期保存到关闭浏览器为止,Cookie ...
- PHP 文件上传类
FileUpload.; $]; $_newname = date(,). : To ...
- php 文件上传类 实例分享
最近在研究php上传的内容,找到一个不错的php上传类,分享下. <?php /** * 文件上传类 * class: uploadFile * edit: www.jbxue.com */ c ...
- [上传下载] C#FileUp文件上传类 (转载)
点击下载 FileUp.zip 主要功能如下 .把上传的文件转换为字节数组 .流转化为字节数组 .上传文件根据FileUpload控件上传 .把Byte流上传到指定目录并保存为文件 看下面代码吧 // ...
- ThinkPHP文件上传类
TP框架自带文件上传类使用: 类文件在ThinkPHP/Library/Think/默认在目录下 public function upload(){ $upload = new \Think\Uplo ...
- C#文件上传类,文件流,字节数组等
using System;using System.IO;using System.Web;using System.Web.UI.WebControls; namespace DotNet.Util ...
- springboot文件上传下载简单使用
springboot的文件上传比较简单 一.使用默认的Resolver:StandardServletMultipartResolver controller package com.mydemo.w ...
随机推荐
- AngularJS中的http拦截
$http服务允许我们与服务端交互,有时候我们希望在发出请求之前以及收到响应之后做些事情.即http拦截. $httpProvider包含了一个interceptors的数组. 我们这样创建一个int ...
- Android——BitMap(位图)相关知识总结贴
Android中文API(136) —— Bitmap http://www.apkbus.com/android-54644-1-1.html Android 4.0 r1 API—Bitmap(S ...
- redis 配置文件 append only file(aof)部分---数据持久化
############################## 仅追加方式 ############################### #默认情况下Redis会异步的将数据导出到磁盘上.这种模式对许 ...
- 【Android开发坑系列】之try-catch
try { mViewPager.postDelayed(new Runnable() { @Override public void run() { getCurrentPage().render( ...
- pip 安装psycopg的错误
psycopg包安装有点问题,特别是在windows下,pip从requirements.txt批量安装总是出错,发现是这个包的问题. 这里需要用easy_install来装,因为gfw的问题,最好下 ...
- 【Theano】安装Theano
http://blog.csdn.net/niuwei22007/article/details/47684673 http://blog.csdn.net/m624197265/article/de ...
- Oracle Goldengate REPLICAT启动时报正在运行解决办法
stop replicate时报ERROR: opening port for REPLICAT MYREP (TCP/IP error: Connection refused). start rep ...
- 使用 DJ Java Decompiler 将整个jar包反编译成源文件
使用 DJ Java Decompiler 将整个jar包反编译成源文件 所使用的软件是 DJ Java Decompiler 3.9. 下面是一个有用的参考文档,说明如何批量编译 http://ww ...
- Windows Azure 入门系列课程Windows Azure 入门系列课程
Windows Azure 入门系列课程 https://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/NewSeries/A ...
- Django 源码小剖: 响应数据 response 的返回
响应数据的返回 在 WSGIHandler.__call__(self, environ, start_response) 方法调用了 WSGIHandler.get_response() 方法, 由 ...