使用 COM 和 ASP 进行文件上传






4.78/5 (6投票s)
2000 年 8 月 7 日

227556

2537
一个简单的 COM 组件,附带源代码,为您的 ASP 页面提供文件上传功能。
引言
这篇文章是关于通过 COM 组件 (IUploader
接口) 上传文件。它使用 IRequest
接口来检索所需的信息。
有很多免费和商业解决方案,但我希望用一种简单的方法来创建我的。
由于在上传文件时您不能使用 request 对象,我创建了方法 GetFormValue
从表单中检索任何变量。 您传递变量名(区分大小写),它会返回找到的值。
为了完成文件上传并检索任何表单变量,需要从 request 对象中获取整个缓冲区并对其进行解释。 这是这个缓冲区的基本示例
-----------------------------7d034c2160334 Content-Disposition: form-data; name="UploadFile"; filename="C:\SampleFile.txt" Content-Type: text/plain Test file... -----------------------------7d034c2160334 Content-Disposition: form-data; name="submit1" Submit -----------------------------7d034c2160334 Content-Disposition: form-data; name="userName" me -----------------------------7d034c2160334--
如何使用
这些是 IUploader
接口的方法
方法 | 描述 |
StartUpload(IUnknown* pIUnk) |
在创建组件后应该调用此方法。 pIUnk 必须是 Request 接口 |
SetDestinationPath(BSTR bsPath) |
必须调用此方法来定义将保存文件的位置。 如果目录不存在,则会创建该目录 |
GetError(long lError, BSTR* pbsReturn) |
此方法返回上传失败的错误消息。 lError 是对 UploadFile 的调用的返回值 |
SetMaxFileSize(long lSize) |
定义要上传的最大文件大小(字节)。 如果 lSize 为 -1,则没有限制 |
GetFormValue(BSTR bsFieldName, BSTR* pbsReturn) |
获取表单变量的值 |
UploadFile(BSTR bsFieldName, long* plResult) |
上传文件。 如果 lResult 等于 0,则操作成功 |
SetAllowedExtensions(SAFEARRAY(VARIANT) FileExtensions) |
指示允许的扩展名。 默认值表示允许所有扩展名 |
SetForbiddenExtensions(SAFEARRAY(VARIANT) FileExtensions) |
定义禁止的文件扩展名 |
GetUploadFilename(BSTR bsField, BSTR* pbsFilename) |
返回上传文件的文件名 |
以下 VBScript 代码使用我的组件上传文件
const UploadOK = 0 const FilesizeInvalid = 1 const ExtensionNotAllowed = 2 const DestinationPathInvalid = 3 const UnknownError = 4 const UnableToCreateFile = 5 const FileDoesntExist = 6 Set objUploader = Server.CreateObject("InetUtil.Uploader") objUploader.StartUpload(Request) 'passing the IRequest interface for the component strUserName = objUploader.GetFormValue("userName") objUploader.SetDestinationPath "c:\temp" objUploader.SetAllowedExtensions "*" ' all extensions objUploader.SetForbiddenExtensions "exe", "com" nUploadResult = objUploader.UploadFile("uploadFile")
我本可以使用 ASP 组件,这样我就有 IRequest
接口了。 但过去我遇到了一些问题,这就是我没有使用这种方法的原因。 :o)
警告: 存在两个已知的内存泄漏,我不知道它们来自哪里。 我认为这与 COleSafeArray
的不良使用有关。 如果您发现了,请提交。
为了使用演示,您必须拥有 Win 2K 或 NT 机器 (IIS),因为 COM 服务器是进程外的。 要在 Win95/98 机器 (PWS) 中使用它,您应该创建一个新的进程内组件,然后复制实现。