asp文件上传源码
去年帮朋友改一个老后台,传源上传图片死活报错“ADODB.Stream 错误 '800a0bbc'”。传源服务器是传源Windows Server 2008,IIS 7.5,传源纯ASP环境。传源折腾半天才搞明白,传源问题出在权限上——IIS_IUSRS组对临时目录没有写权限。传源这个坑我记到现在。传源
ASP文件上传,传源核心就两样东西:Request.BinaryRead和ADODB.Stream。传源前者把客户端POST上来的传源二进制数据读进来,后者负责把数据拆开、传源存成文件。传源没有第三方组件的传源话,这套组合拳是传源唯一的路。
先看最基础的代码骨架:
<% Dim binData, totalBytes totalBytes = Request.TotalBytes binData = Request.BinaryRead(totalBytes) %> Request.TotalBytes拿到的是整个请求体的字节数。注意,这里包含表单字段和文件内容混在一起。如果表单里既有文本框又有文件域,就得自己解析multipart/form-data的边界。很多人直接找个现成的upload类,比如无惧上传类或者化境上传,省事。
但我想说的是,理解原理比复制粘贴强。边界字符串藏在Content-Type头里,形如boundary=---------------------------7e0b1c2a3d4e。用InStrB在二进制流里找这个边界,然后按块切分。文件数据块前面还有几行头信息,比如Content-Disposition和Content-Type,得跳过两个CRLF才能拿到真正的文件字节。
ADODB.Stream的用法有讲究。先创建对象,Type设为1(二进制),Open,然后Write切出来的文件数据。最后SaveToFile。这里有个细节:SaveToFile的第二个参数adSaveCreateOverWrite要设为2,否则同名文件会报错。我见过有人写1,结果文件覆盖不了,还以为是权限问题。
Dim stm Set stm = Server.CreateObject("ADODB.Stream") stm.Type = 1 stm.Open stm.Write fileData stm.SaveToFile savePath, 2 stm.Close Set stm = Nothing 路径处理是个麻烦事。Server.MapPath("/upload/")拿到物理路径,但目录必须提前建好,ASP不会自动创建。而且上传目录最好别给执行权限,IIS里把“脚本”和“可执行文件”都关掉。不然有人传个.asp的马上去,直接拿到shell。这不是危言耸听,早年很多站就是这么被搞的。
文件大小限制也得提。IIS默认请求体上限是200KB左右,具体看版本。大文件上传前,得改metabase或者web.config里的maxRequestLength。ASP时代改起来麻烦,现在IIS 7以上直接在web.config写:
<system.web> <httpRuntime maxRequestLength="102400" /> </system.web> 单位是KB,102400就是100MB。改完记得重启IIS。另外ASP脚本超时时间默认90秒,大文件传一半断了,可能就是超时。Server.ScriptTimeout设大点,比如600。
还有个坑:中文文件名。Request.BinaryRead出来的字节流里,文件名是UTF-8还是GBK取决于浏览器。老IE发GBK,Chrome发UTF-8。不转码的话,存出来的文件名就是乱码。我一般用ADODB.Stream读一遍再转,或者干脆用时间戳重命名,省心。
最后说个实际案例。那个后台的上传功能,我最后把临时目录改到C:\Windows\Temp,给IIS_IUSRS完全控制权限,问题解决。但更好的做法是专门建个upload_temp目录,只给写权限,不给读和执行。安全这事,多一步不亏。
ASP确实老了,但老系统还得维护。这些代码现在看可能土,能跑通、不出安全漏洞,就是好代码。
(责任编辑:热点)
- ·美国黑人被警方按压身亡画面
- ·日本mycom
- ·宁波ip地址
- ·潍坊找工作
- ·公司网站后台怎么登录
- ·完成渗透
- ·网络安全典型案例分析
- ·杭州软件开发
- ·asp企业有哪些
- ·大型企业网站














