代码如下 | 复制代码 |
/// /// this /// 文件保存目录,相对路径示例:"~/UploadFile",绝对路径示例:"E:UploadFile",提示:web路径中用斜杠,文件系统中用反斜杠 /// FileUpload /// 是否检查文件名,true表示不允许文件名重复,false则文件名加时间重命名 /// 允许上传的文件类型,扩展名,例:"xls",不限制类型传null即可 /// public static string UploadFileToServer(Page page, String path, FileUpload fu, Boolean checkFileName, params String[] allowTypes) { //记录文件名 string fileName = fu.FileName; //是否选择文件 if (string.IsNullOrEmpty(fileName)) { MsgBox.Alert(page, "请先选择文件!"); return null; } //记录文件扩展名 string fileType = fileName.Substring(fileName.LastIndexOf('.') + 1); //判断扩展名是否允许 bool typeRight = false; //记录允许上传的文件类型 string allowType = ""; //是否指定文件类型 if (allowTypes != null) { //遍历允许文件类型数组 for (int i = 0; i < allowTypes.Length; i++) { //已判断为允许则不再判断 if (!typeRight) { //扩展名大小转换判断是否符合要求 if (fileType == allowTypes[i] || fileType.ToLowerInvariant() == allowTypes[i] || fileType.ToUpperInvariant() == allowTypes[i]) { //符合要求则设置为允许 typeRight = true; } } //记录允许上传的文件类型 allowType += "." + allowTypes[i] + " | "; } //删除最后一个分隔符 allowType = allowType.Remove(allowType.LastIndexOf("|")); } //未指定文件类型时 else { //直接设置为允许 typeRight = true; } //扩展名不正确 if (!typeRight) { //提示允许上传的文件类型 MsgBox.Alert(page, "文件格式不正确,请选择扩展名为[ " + allowType + " ]的文件!"); return null; } //是否可以正常获取文件 if (fu.PostedFile.ContentLength == 0) { MsgBox.Alert(page, "找不到选择的文件,请重新选择!"); return null; } //目录绝对路径 string dirRootPath = ""; //文件路径异常处理 try { //如果路径是相对路径 if (!Path.IsPathRooted(path)) { //目录相对路径转绝对路径 dirRootPath = HttpContext.Current.Server.MapPath(@"" + path + "/").Trim(); } else { //保存路径 dirRootPath = path; } //文件上传目录是否存在 DirectoryInfo dirInfo = new DirectoryInfo(dirRootPath); if (!dirInfo.Exists) { //不存在则创建此目录 dirInfo.Create(); } } catch (Exception pathError) { //异常弹窗提示 MsgBox.Alert(page, "错误:" + pathError.Message); return null; } //记录文件绝对路径 string fileRootPath = ""; //需要检查文件名是否重复时 if (checkFileName) { //文件绝对路径 fileRootPath = Path.Combine(dirRootPath, fileName); //文件名已存在 if (File.Exists(fileRootPath)) { //提示改名 MsgBox.Alert(page, "服务器已存在同名文件,请修改文件名后重试!"); return null; } } else { //选择的文件按时间重命名 string newFileName = fileName.Remove(fileName.LastIndexOf(".")) + DateTime.Now.ToString("yyMMddHHmmss") + DateTime.Now.Millisecond.ToString() + "." + fileType; //文件绝对路径 fileRootPath = Path.Combine(dirRootPath, newFileName); } //上传至服务器 fu.SaveAs(fileRootPath); //返回文件绝对路径 return fileRootPath; |
三个方面需要注意:
1.确认是否包含文件
在调用 SaveAs 方法将文件保存到服务器之前,使用 HasFile 属性来验证 FileUpload 控件确实包含文件。若 HasFile 返回 true,则调用 SaveAs 方法。如果它返回 false,则向用户显示消息,指示控件不包含文件。不要通过检查PostedFile 属性来确定要上载的文件是否存在,因为默认情况下该属性包含 0 字节。因此,即使 FileUpload 控件为空,PostedFile 属性仍返回一个非空值。
2.文件上传大小限制
默认情况下,上传文件大小限制为 4096 KB (4 MB)。可以通过设置 httpRuntime 元素的 maxRequestLength 属性来允许上载更大的文件。若要增加整个应用程序所允许的最大文件大小,请设置 Web.config 文件中的 maxRequestLength 属性。若要增加指定页所允许的最大文件大小,请设置 Web.config 中 location 元素内的 maxRequestLength 属性。
上载较大文件时,用户也可能接收到以下错误信息:
aspnet_wp.exe (PID: 1520) was recycled because memory consumption exceeded 460 MB (60 percent of available RAM).
以上信息说明,上传文件的大小不能超过服务器内存大小的60%。这里的60%是Web。config文件的默认配置,是
3.上传文件夹的写入权限
应用程序可以通过两种方式获得写访问权限。您可以将要保存上载文件的目录的写访问权限显式授予运行应用程序所使用的帐户。您也可以提高为 ASP.NET 应用程序授予的信任级别。若要使应用程序获得执行目录的写访问权限,必须将 AspNetHostingPermission 对象授予应用程序并将其信任级别设置为 AspNetHostingPermissionLevel.Medium 值。提高信任级别可提高应用程序对服务器资源的访问权限。请注意,该方法并不安全,因为如果怀有恶意的用户控制了应用程序,他(她)也能以更高的信任级别运行应用程序。最好的做法就是在仅具有运行该应用程序所需的最低特权的用户上下文中运行 ASP.NET 应用程序。