我可以“当”你吗?
目录 |
简介 |
数据库 |
起步 |
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; |