gpt4 book ai didi

德尔福 SOAP : delete temporary file after response dispatched

转载 作者:行者123 更新时间:2023-12-03 15:23:19 26 4
gpt4 key购买 nike

我有一个 SOAP 方法,可以即时创建并响应 PDF 内容。

在方法finally上,临时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;

最佳答案

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

此类创建一个带有临时且自毁文件的流。

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;

发送响应后,流将被释放,文件将被删除。

关于德尔福 SOAP : delete temporary file after response dispatched,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33351760/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com