Delphi SOAP:在发送响应后删除临时文件
我有一个soap方法,可以动态创建并响应PDF内容 在方法Delphi SOAP:在发送响应后删除临时文件,delphi,soap,Delphi,Soap,我有一个soap方法,可以动态创建并响应PDF内容 在方法最后中,删除临时pdf文件 最后是执行此操作的正确位置吗 procedure TWbModule.WbModuleGetPDFAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var aPDFFileTemp : string; begin try // getTempPd
最后
中,删除临时pdf文件
最后是执行此操作的正确位置吗
procedure TWbModule.WbModuleGetPDFAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
aPDFFileTemp : string;
begin
try
// getTempPdf() creates and returns the PDF path, eg.: C:\files\foo.pdf
aPDFFileTemp := getTempPdf();
// set response content stream with file stream
Response.ContentStream := TFileStream.Create(aPDFFileTemp, fmOpenRead or fmShareDenyNone);
Response.ContentType := 'application/pdf';
finally
// delete temporary file
// It is the right place for perform this operation?
if FileExists(aPDFFileTemp) then DeleteFile(aPDFFileTemp );
end;
end;
最好使用内存流,将文件加载到其中,然后删除文件(在finally中)。SOAP库在发送响应后应该清理内存流 如果您只想拥有一个临时文件,则应将其创建为临时文件 此类使用临时的自毁文件创建流
uses
System.Classes;
type
TTempFileStream = class( THandleStream )
public
constructor Create( );
destructor Destroy; override;
end;
implementation
uses
System.IOUtils,
System.SysUtils,
Winapi.Windows;
{ TTempFileStream }
constructor TTempFileStream.Create;
var
fileName : string;
fileHandle: THandle;
begin
fileName := TPath.GetTempFileName( );
fileHandle := CreateFile(
PChar( fileName ),
GENERIC_ALL,
0,
nil,
CREATE_ALWAYS,
FILE_ATTRIBUTE_TEMPORARY or FILE_FLAG_DELETE_ON_CLOSE,
0 );
if fileHandle = INVALID_HANDLE_VALUE
then
RaiseLastOSError( GetLastError, sLineBreak + fileName );
inherited Create( fileHandle );
end;
destructor TTempFileStream.Destroy;
begin
CloseHandle( Handle );
inherited;
end;
最好的选择是将数据(PDF内容)写入此TTempFileStream
,并从getTempPdf()返回实例
发送响应时,流将被释放,文件将被删除
function getTempPdf() : TStream;
begin
Result := TTempFileStream.Create;
// create the PDF document and write into the result stream
end;
procedure TWbModule.WbModuleGetPDFAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
Response.ContentStream := getTempPdf();
Response.ContentType := 'application/pdf';
end;