加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi SOAP:在调度响应后删除临时文件

发布时间:2020-12-15 09:21:22 所属栏目:大数据 来源:网络整理
导读:我有一个肥皂方法,即时创建和回复PDF内容. 最后在方法上,临时pdf文件被删除. 它最终是执行此操作的正确位置? procedure TWbModule.WbModuleGetPDFAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);var aPDFFi
我有一个肥皂方法,即时创建和回复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:filesfoo.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;

解决方法

如果您只想拥有一个临时文件,那么您应该将其创建为临时文件.

此类使用临时和自毁文件创建流.

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,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;

发送响应时,将释放流并删除该文件.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读