【问题标题】:Delphi DataSnap upload xml file in bodyDelphi DataSnap在正文中上传xml文件
【发布时间】:2022-06-14 22:20:03
【问题描述】:

在带有 Datasnap 组件的 delphi 10 中,我试图声明一个接收 XML 文件的 Post 方法,但我不能。

有人知道Datasnap是否只能在正文中接收Json格式类型吗?

(相反,任何例子都会很棒)

提前致谢。

【问题讨论】:

  • 请提供示例代码,说明您所做的对您不起作用的操作。

标签: delphi datasnap


【解决方案1】:

您可以像这样使用 datasnap WebModuleUnit 和自定义 ufileUploader 单元来克服这个问题:

  1. 在 WebModuleUnit 中:
    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;
  1. 在您的 ufileUploader 单元中:
    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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2012-09-03
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    相关资源
    最近更新 更多