你的文件上传功能是不是总报"未能找到路径"?上周有个开发OA系统的哥们,因为上传模块反复崩溃被领导骂惨了。别慌,今天咱们就掰扯清楚ASP.NET上传功能的那些门道,保你半小时搞定基础功能!
先搞懂基本套路
在.aspx页面拖个FileUpload控件,后台用Request.Files收文件——这招幼儿园级操作咱就不啰嗦了。重点来了:必须检查HasFile属性,否则用户不选文件直接点上传,分分钟程序崩溃给你看。代码这么写最保险:
csharp**if(FileUpload1.HasFile){ string fileName = Path.GetFileName(FileUpload1.PostedFile.FileName); FileUpload1.SaveAs(Server.MapPath("~/uploads/") + fileName);}
突然想到,有新手直接把文件存到C盘根目录,结果被安全软件当病毒拦截了。这里有个铁律:永远用Server.MapPath转换物理路径!
文件类型验证的三大狠招
- 前端用accept属性限制(但别指望这个能防恶意用户):
html运行**<asp:FileUpload ID="FileUpload1" accept=".pdf,.docx" />
- 后台检查扩展名更靠谱:
csharp**string[] allowExtensions = { ".jpg", ".png" };if(!allowExtensions.Contains(Path.GetExtension(fileName).ToLower())){ throw new Exception("文件类型不支持!");}
- 终极杀器——读取文件头验证真实类型:
csharp**using (var reader = new BinaryReader(FileUpload1.PostedFile.InputStream)){ byte[] header = reader.ReadBytes(8); //PNG头是89 50 4E 47 0D 0A 1A 0A if(!IsValidFileHeader(header, FileType.Image)){ //拦截非图片文件 }}
上周有个做医疗系统的客户,就是靠第三招拦下了伪装成PDF的勒索病毒。所以说,安全这事再怎么谨慎都不为过!
上传进度条怎么搞?
用UpdatePanel+Timer控件模拟进度显示,虽然有点糙但够用。进阶玩法得用HTML5的FormData配合jQuery.ajax,代码长这样:
javascript**$('#btnUpload').click(function(){ var formData = new FormData(); formData.append(' $('#fileInput')[0].files[0]); $.ajax({ url: '/UploadHandler.ashx', type: 'POST', data: formData, processData: false, contentType: false, xhr: function(){ var xhr = new XMLHttpRequest(); xhr.upload.addEventListener('progress', function(e){ var percent = Math.round((e.loaded / e.total) * 100); $('#progres**ar').css('width', percent + '%'); false); return xhr; } });});
不过实测发现IE11下可能抽风,建议加个polyfill库保底。要是嫌麻烦,直接引用第三方上传控件像Bootstrap-Fileinput,省心省力。
大文件上传必知技巧
先在web.config里改这两个配置:
xml**<system.web> <httpRuntime maxRequestLength="102400" executionTimeout="3600" />system.web><system.webServer> <security> <requestFilter
maxAllowedContentLength="104857600" /> requestFiltering> security>system.webServer>
但超过100MB的文件建议分片上传,用plupload之类的库实现断点续传。去年帮视频网站做项目,8GB的视频文件分5000多个块上传,网络中断还能从第2561块接着传。
有兄弟问为啥不用现成云存储?小项目当然可以直接传服务器,但用户量上来后,七牛云、阿里云OSS这些对象存储才是正解。不过话说回来,自己动手实现一遍底层逻辑,遇到问题才不会抓瞎。最后扔个干货:用LogParser分析IIS日志,找出上传失败请求的规律,比瞎猜效率高十倍!