3

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

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

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

我有一个 /test 方法,type=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(因为我需要在稍后提供文件时返回它)

4

2 回答 2

10

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

附带说明一下,一旦您使用多部分表单 Request.GetFieldByName 似乎不再起作用,但 Request.ContentFields.Values['fieldname'] 可以。

于 2014-07-14T18:01:56.207 回答
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

于 2014-01-30T14:53:22.293 回答