得,今天来说说我前段时间折腾那个老掉牙的ASP网站文件上传的事儿。那系统有些年头,客户突然说要加个上传附件的功能,你说这事儿闹的。
没办法,硬着头皮得上。翻翻以前的东西,找出来一个叫AspUpload的组件,好像以前项目用过,也不知道还能不能跑起来。
开始动手
第一步,我先把这组件弄到服务器上。这玩意儿是个COM组件,得先注册一下。在服务器上开个命令行窗口,用`regsvr32`命令指到那个dll文件,敲回车。还没报错,提示注册成功,心里稍微踏实点。
接着就是改代码。前端页面得加个表单,得有``让人家选文件,表单的`enctype`属性得改成`multipart/form-data`,这都是老规矩。这个倒腾起来还算快。
重点来,后台ASP代码怎么写?
我先是创建AspUpload的实例对象,类似 `Set Upload = *("*")` 这样。然后就得琢磨怎么用它来接收文件。
文档找不到,只能连蒙带猜,再加上回忆。大概记得是用一个`Save`或者类似的方法来保存文件。试试,果然不行,报错。
踩坑过程
第一个坑就是文件夹权限。我指定一个上传目录,但文件死活写不进去。检查路径没错。后来折腾半天,突然想起来ASP跑的时候用的是哪个用户来着?好像是IUSR或者NETWORK SERVICE之类的。赶紧去看那个上传文件夹的权限设置,果然,这些用户没有写入权限。联系服务器管理员,让他给加上写入权限,再试,文件能传上去!虽然是个0KB的空文件,但至少有进展。
第二个坑是中文文件名。传英文名的文件没问题,一传中文名的,要么报错,要么文件名存到服务器上就变成一堆乱码。这下头疼。我想起来好像AspUpload对象有个`CodePage`属性,是用来处理编码的。试好几个值,什么936(GBK),都不太对。后来想到现在网页普遍用UTF-8,就试下UTF-8对应的代码页值,好像是65001。* = 65001
加上这句之后,再传中文文件名的文件,正常!文件名在服务器上看着也对。
后面还调整下,比如限制一下上传文件的大小,免得有人传个电影上来把服务器撑爆。这些在它的属性里也能设置,找找也就找到。
最终搞定
具体的保存代码大概是这样写的(记不太清,大概是这个意思):
- 先用`* "文件保存路径"` 这样把文件存到服务器的临时目录。
- 然后通过 `*("表单里file控件的name")` 来获取上传的文件信息,比如文件名`FileName`,大小`Size`等等。
- 拿到原始文件名后,我一般会重新生成一个唯一的文件名,防止重名覆盖,也更安全点。
- 再把临时保存的文件移动或者复制到最终的存储位置,并且把文件信息,比如新文件名、原始文件名、路径这些存到数据库里,方便以后管理和下载。
前前后后折腾两天,总算是把这个功能给加上去。虽然过程磕磕绊绊,全是经验主义和试错,但看到用户能顺利上传文件,客户那边也验收通过,心里还是挺有成就感的。
现在用这些老技术真是感觉有点别扭,跟现在流行的框架比起来,太原始,啥都得自己手动处理。但没办法,老系统也得维护不是?能解决问题就行。