从Delphi中的TWebRequest获取文件

时间:2013-11-14 09:44:44

标签: delphi delphi-xe3

我使用Delphi作为服务器来处理许多不同的请求。所有这些都是简单的字符串工作正常,但我收到文件时遇到了一些麻烦。

所有都是使用Webbroker服务实现的,所以我得到了一个方法

WebModule1WebActionItem1Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);

我有一个/ test方法,类型= mtPost。

在动作内部,我执行以下操作:

MimeType   := Request.ContentFields.Values['MimeType'];
  for i := 0 to Request.Files.Count-1 do begin
    // never entered
    aFile := Request.Files.Items[i];
    ms := TMemoryStream.Create;
    aFile.Stream.Position := 0;
    ms.CopyFrom(aFile.Stream, aFile.Stream.Size);
    ms.SaveToFile(path+aFile.FileName);
    ms.free;
  end;

显然我发送的内容从未被识别为文件,但我不知道为什么。 用于发布的HTML,如下所示:

<form id="myForm" action="http://localhost:8080/test" method="post" enctype="multipart/form-data">
     <input type="file" size="60" name="myfile">
     <input type="text" size="10" name="mimetype" value="image/hest">
     <input type="submit" value="upload">
 </form>

我会告诉任何人告诉我什么可能是错的 - 以及如何解决它。 基本上我只需要能够收到1个文件,包括mimetype(因为我需要在以后提供文件时返回它)

2 个答案:

答案 0 :(得分:6)

我遇到了同样的问题,花了很长时间才找到答案。默认情况下,TWebRequest不处理Multipart表单。在项目中包含ReqMulti单元,它将扩展为支持multipart,突然Request.Files对象实际上将包含数据。

作为旁注,一旦您使用多部分表单,Request.GetFieldByName似乎不再起作用,但Request.ContentFields.Values ['fieldname']会起作用。

答案 1 :(得分:0)

你可以简单地阅读原始请求并拆分第一个双重换行符:

Data := Request.ReadUnicodeString(Request.ContentLength);
// Where StrAfter is a function that splits on the first occurrence
// of the first parameter.
Data := Trim(StrAfter(#13#10#13#10, Data));

当然,这只允许您阅读一个文件。也许您应该阅读标题以查看每个文件的确切长度,以便在它们之间拆分Data