日期:2011-07-10 浏览次数:21184 次
最近我接手了一个项目,它将一个保修申请(Warranty Claim)系统搬到网上。项目的重头戏是存储和保修申请有关的图像。我选用的组件包括:
· 一个数据库表来存储图像
· 一个ASP网页来上传图像
· 一个脚本用于解释上传的图像,并把它们存储到表中
· 一个网页用于查看与选定的申请号码对应的图像名称
· 一个网页用于显示实际图像
下面来仔细研究一下应用程序的每个组件。
表
由于我只是想快速验证一下方案的可行性,所以使用的是Microsoft Access,而不是SQL Server、Oracle或者MySQL等更可靠的数据库。由于要处理的信息肯定不止保修申请和图像,所以表中也肯定不止包含2列,如图A所示。这些列是的含义是不言而喻的,惟一值得一提的就是图像的内容类型(content_type),它是指图形文件的数据类型。OLE Object用于取代二进制大对象(BLOB),因为我们使用的是Access。
图A
上传页面
得到这份工作后,我花了约10分钟的时间思索怎样从客户端将一个文件上传到ASP服务器。后来,我想起HTML input元素有一个type属性,它可设为file。同时也想起了accept属性,它有助于根据MIME类型来筛选列出的文件。但遗憾的是,这种实现质量不是很高。
form元素是上传页面中的最后一个“客户端”部分。该元素由于牵涉到文件上传,所以必然要进行特殊处理,具体就是将method属性设为post,并将enctype属性设为multipart/form-data,这是一次性发送多个文件的标准做法。最后,在使用客户端javascript的情况下,为了确保文本与文件在表单提交时是分离的,我为表单的action属性添加了申请号码(claim number)。图B展示了最终的网页,代码如清单A所示。
图B
服务器端脚本
表单被提交后,表单的action属性所指定的脚本将获得控制权。该脚本决定以后要采取的操作。后期工作实际很简单,因为申请号码、所有文件以及这些文件的属性都是由客户端一次性发送过来的。还可采取程序化的方式分离这些数据,但我选择使用aspSmart免费提供的aspSmartUpload组件来分离不同的文件。该组件包括文档和示例,极大简化了我的工作。
aspSmartUpload组件的Files对象提供了一个方法来访问集合中的单独文件。每个文件的属性是用File对象来检索的,这些属性包括文件名、MIME类型、MIME子类型以及文件本身。
图像列表和显示
如果同时根据申请号码和文件名来列出图像,要比单纯显示图像合理得多。这样一来,拨号用户就可选择自己需要的一幅图像,而不至于使带宽吃紧。考虑到这一点,我创建了如图C所示的网页。它的代码如清单B所示。
图C
通常,当一幅图像在网页上显示时,图像本身是来源于一个文件的。例如,内容类型是根据文件扩展名而确定的,比如whatever.jpeg或者stuff.gif。但遗憾的是,由于图像存储在一个表中,所以我们无法享受这一便利。不过,我们的优势在于已经掌握了内容类型。
在由弹出窗口、一个IFrame或者一个Frame调用的脚本中,可利用内容类型来设置Response对象的内容类型,并将图像以二进制形式写入,具体方式如下:
Response.ContentType = rsImage("content_type")
Response.BinaryWritersImage("picture")
清单C展示了细节。
不要被实现细节阻挠
一般人最开始都知道这个项目肯定能实现,但等具体做起来,才发现实现细节严重影响了自己的进度。碰到这种情况,不要灰心,只有步步为营,才能最终取得成功。