Delphi SOAP:在发送响应后删除临时文件

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

我有一个soap方法,可以动态创建并响应PDF内容

在方法
最后
中,删除临时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;