ASP.NET实现的简单易用文件上传类
程序员文章站
2024-02-13 15:17:46
调用方法:
uploadfile uf = new uploadfile();
/*可选参数*/
uf.setisuseoldfilename(true...
调用方法:
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 } }