我使用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(因为我需要在以后提供文件时返回它)
答案 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
。