ASP.NET實現(xiàn)的簡單易用文件上傳類
更新時間:2015年06月08日 09:24:31 投稿:junjie
這篇文章主要介紹了ASP.NET實現(xiàn)的簡單易用文件上傳類,本文給出實現(xiàn)代碼和使用方法示例,需要的朋友可以參考下
調(diào)用方法:
UploadFile uf = new UploadFile();
/*可選參數(shù)*/
uf.SetIsUseOldFileName(true);//是否使用原始文件名作為新文件的文件名(默認:true),true原始文件名,false系統(tǒng)生成新文件名
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>
/// ** 描述:單文件上傳類 (暫時不支持多文件上傳)
/// ** 創(chuàng)始時間: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系統(tǒng)生成新文件名</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>
/// 保存表單文件,根據(jù)編號創(chuàng)建子文件夾
/// </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>
/// 保存表單文件,根據(jù)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>
/// 根據(jù)物理路徑獲取相對路徑
/// </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);
// 創(chuàng)建目錄
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>
/// 根據(jù)時間創(chuàng)建存儲目錄
/// </summary>
dateTimeNow = 0,
/// <summary>
/// 根據(jù)ID編號方式來創(chuàng)建存儲目錄
/// </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>
/// 網(wǎng)站路徑
/// </summary>
public string WebFilePath { get; set; }
/// <summary>
/// 獲取文件名
/// </summary>
public string FileName { get; set; }
}
#endregion
}
}
您可能感興趣的文章:
- asp 中常用的文件處理函數(shù)
- ASP.NET MVC處理文件上傳的小例子
- asp.net 文件上傳實例匯總
- asp.net文件上傳示例分享
- ASP.NET讓FileUpload控件支持瀏覽自動上傳功能的解決方法
- asp.net fileupload控件上傳文件與多文件上傳
- asp.net FileUpload控件實現(xiàn)文件格式判斷與文件大小限制
- ASP.NET對大文件上傳的解決方案
- asp.net批量多選文件上傳解決方案
- ASP.NET設計FTP文件上傳的解決方案
- asp.net文件上傳帶進度條實現(xiàn)案例(多種風格)
- asp.net文件上傳解決方案(圖片上傳、單文件上傳、多文件上傳、檢查文件類型)
- ASP.NET?MVC5實現(xiàn)文件上傳與地址變化處理(5)
- ASP.NET文件處理如何操作
相關文章
Asp.net利用JQuery AJAX實現(xiàn)無刷新評論思路與代碼
Asp.net利用JQuery AJAX實現(xiàn)無刷新評論,此功能是每一個從事asp.net開發(fā)者的朋友都希望實現(xiàn)的,本文利用閑暇時間整理了一些,有需要的朋友可以參考下2012-12-12
微信公眾平臺開發(fā)之發(fā)送文本消息.Net代碼解析
這篇文章主要為大家詳細解析了微信公眾平臺開發(fā)之發(fā)送文本消息.Net代碼,感興趣的小伙伴們可以參考一下2016-06-06
asp.net 動態(tài)創(chuàng)建TextBox控件及狀態(tài)數(shù)據(jù)如何加載
接著上文Asp.net TextBox的TextChanged事件你真的清楚嗎?這里我們來說說狀態(tài)數(shù)據(jù)時如何加載的,需要的朋友可以參考下2012-12-12
ASP.NET設計網(wǎng)絡硬盤之查看文件夾實現(xiàn)代碼
下面要介紹的實例包括網(wǎng)上硬盤的許多功能,將一步步為大家進行介紹。首先創(chuàng)建工程實例,然后進行主界面的設計,最后對各個功能的實現(xiàn)分別進行介紹2012-10-10
ASP.NET URL偽靜態(tài)重寫實現(xiàn)方法
ASP.NET下為靜態(tài)的實現(xiàn)方法。2009-12-12

