为站点创建下载管理程序—ISAPI,ADO,Delphi 5

ZDNet软件频道 时间:2000-08-09 作者:Marc Hoffman |  我要评论()
本文关键词:
在本文中我们来讨论如何创建定制的ISAPI DLL控制站点中的下载。我们使用DELPHI开发DLL。

我可以“当”你吗?

目录
简介
数据库
起步
Who Am I??
我可以“当”你吗?
仅此而已吗?

一旦确认了用户信息,我们就可以检查用户是否可以下载他所请求的文件。

sp_IsUserDownload.Parameters.ParamByName('@UserID').Value := UserID;
sp_IsUserDownload.Parameters.ParamByName('@DownloadID').Value := DownloadID;
sp_IsUserDownload.ExecProc();


if (sp_IsUserDownload.Parameters.ParamByName('RETURN_VALUE').Value > 0) then begin

 {ToDo: user may download file. Now send it to him }
end

else
 Error(Response,ERROR_INVALID_DOWNLOAD);

如果用户可以下载,存储进程会返回正值,如果不可以将返回0。我们只需要设置合适的参数,命名为UserID,DownloadID,执行存储进程,检查返回值。如果值大于0,就查询Downloads表得到文件的具体位置,并通过Response对象返回给用户。

qry_AllDownloads.Parameters.ParamByName('DownloadID').Value := DownloadID;
qry_AllDownloads.Open();

try
 if (qry_AllDownloads.RecordCount = 1) then begin
   SendFile(Response,qry_AllDownloads.FieldByName('FilePath').AsString);
 end

 else
   Error(ERROR_INVALID_DOWNLOAD)
finally
 qry_AllDownloads.Close();
end;

第二种情况是当用户为匿名用户的时候,基本上和上述原理差不多,查询Downloads表中的纪录,但是只是在Public标记为真时才返回给用户。代码和上面的一样,但是使用qry_PublicDownloads代替qry_AllDownloads。我们使用SendFile方法将文件返回到用户那里。代码如下:

procedure TDownloadWebModule.SendFile(iResponse: TwebResponse; iFilename:string);
var FileStream:TFileStream;
begin
 Replace(iFilename,'/','');
 FileStream := TFileStream.Create(fFilebase+iFilename, 
                                  fmOpenRead and fmShareDenyWrite);
 iResponse.ContentStream := FileStream;
 iResponse.ContentType := 'application/x-zip-compressed';
 iResponse.SetCustomHeader('Content-Disposition',
                           'filename='+ExtractFilename(iFilename));
end;

我们将相关的文件名从数据库取出并附加上相关的路径(比如在启动的时候从注册表中得到),然后创建TfileStream。将这个流赋给Response对象的ContentStream属性,Delphi ISAPI框架会自动的将整个内容传递回客户端。

现在只需要确保客户端能够处理数据。将内容类型设为'application/x-zip-compressed'(尽管文件可能是.exe类型或其它的二进制格式,客户端仍然可以复制它们),并设定客户端存储文件的名字。Content-Disposition头确保客户端的应用程序,例如IE或Getright能够得到正确的文件名字。

最后,我们要使用Error方法将可能的错误返回给用户。该方法和上面的异常事件处理程序类似,它将错误重定向到ASP页面中并显示相关的信息。

procedure TDownloadWebModule.Error(iResponse: TWebResponse; iCode:integer);
begin
 iResponse.SendRedirect(fErrorAsp+'?code='+IntToStr(iCode));
end;

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134