【发布时间】:2022-06-14 22:20:03
【问题描述】:
在带有 Datasnap 组件的 delphi 10 中,我试图声明一个接收 XML 文件的 Post 方法,但我不能。
有人知道Datasnap是否只能在正文中接收Json格式类型吗?
(相反,任何例子都会很棒)
提前致谢。
【问题讨论】:
-
请提供示例代码,说明您所做的对您不起作用的操作。
在带有 Datasnap 组件的 delphi 10 中,我试图声明一个接收 XML 文件的 Post 方法,但我不能。
有人知道Datasnap是否只能在正文中接收Json格式类型吗?
(相反,任何例子都会很棒)
提前致谢。
【问题讨论】:
您可以像这样使用 datasnap WebModuleUnit 和自定义 ufileUploader 单元来克服这个问题:
procedure TWebModule1.WebModuleDefaultAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
if Request.InternalPathInfo.StartsWith('/UploadFile') then
Response.Content := ufileUploader.UploadFile(Request)
else if (Request.InternalPathInfo = '') or (Request.InternalPathInfo = '/')
then
Response.Content := ReverseString.Content
else
Response.SendRedirect(Request.InternalScriptName + '/');
end;
unit ufileUploader;
interface
uses Web.HTTPApp;
function UploadFile(ARequest: TWebRequest): string;
implementation
uses System.SysUtils, System.Classes, Web.ReqMulti;
function UploadFile(ARequest: TWebRequest): string;
const
DestPath = 'c:\';
var
i: integer;
LFileName: string;
LStream: TMemoryStream;
begin
if not TMultipartContentParser.CanParse(ARequest) then
begin
Result := 'Cannot parse request';
Exit;
end;
if ARequest.Files.Count < 1 then
begin
Result := 'No file sended';
Exit;
end;
LStream := TMemoryStream.Create;
try
// You have sended ARequest.Files.Count files
for i := 0 to ARequest.Files.Count - 1 do
begin
LFileName := string(ARequest.Files.Items[i].FileName);
LStream.Clear;
// Read the sended file stream
LStream.CopyFrom(ARequest.Files.Items[i].Stream,
ARequest.Files.Items[i].Stream.Size);
LStream.Position := 0;
// Do what you want with the stream
LStream.SaveToFile(DestPath + LFileName);
end;
Result := Format('%d files saved to %s ', [ARequest.Files.Count, DestPath]);
finally
FreeAndNil(LStream);
end;
end;
end.
【讨论】: