ASP.NET文件上传功能如何避免踩坑?

速达网络 源码大全 3

你的文件上传功能是不是总报"未能找到路径"?上周有个开发OA系统的哥们,因为上传模块反复崩溃被领导骂惨了。别慌,今天咱们就掰扯清楚ASP.NET上传功能的那些门道,保你半小时搞定基础功能!

ASP.NET文件上传功能如何避免踩坑?-第1张图片

​先搞懂基本套路​
在.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转换物理路径​​!


​文件类型验证的三大狠招​

  1. 前端用accept属性限制(但别指望这个能防恶意用户):
html运行**
<asp:FileUpload ID="FileUpload1" accept=".pdf,.docx" />
  1. 后台检查扩展名更靠谱:
csharp**
string[] allowExtensions = { ".jpg", ".png" };if(!allowExtensions.Contains(Path.GetExtension(fileName).ToLower())){    throw new Exception("文件类型不支持!");}
  1. 终极杀器——读取文件头验证真实类型:
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日志,找出上传失败请求的规律,比瞎猜效率高十倍!

标签: 避免 上传 功能