尝试在同一个字段中发送HTTP多个文件时遇到麻烦(Delphi)

时间:2014-02-23 19:37:51

标签: delphi indy idhttp

我正在Delphi中创建一个项目,用于将多个文件上传到网络服务器,但不是更多的同一个字段上的文件就像在简单的表单上一样。在我的Delphi代码下面:

procedure Http_arquivos;

var
  i: integer;
  arquivos: array [0..6] of String;
  HTTP: TIdHTTP;
  POSTData: TIdMultipartFormDataStream;

begin
  arquivos[0]:= 'c:\arquivo0.bmp';
  arquivos[1]:= 'c:\arquivo1.bmp';
  arquivos[2]:= 'c:\arquivo2.html';
  arquivos[3]:= 'c:\arquivo3.html';
  arquivos[4]:= 'c:\arquivo4.wav';
  arquivos[5]:= 'c:\arquivo5.bmp';
  arquivos[6]:= 'c:\arquivo6.txt';

  HTTP := TIdHTTP.Create(nil);
  POSTData := TIdMultipartFormDataStream.Create;

  for i:= 0 to Length(arquivos) do
  begin

    if fileexists (arquivos[i]) then 
    begin
      //showmessage(arquivos[i]);
      try
        POSTData.AddFile('files[]', arquivos[i], 'multipart/form-data');
        HTTP.Post('http://localhost/ENVIO/MultUp.php', POSTData);
      finally
        POSTData.Free;
    end;
  end;
end;
end;

1 个答案:

答案 0 :(得分:4)

您的代码有四个问题:

  1. 您的循环计数器错误。您需要改为使用Length(arquivos)-1(或Pred(Length(arquivos))High(arquivos))。

  2. 你在循环中调用Post(),但它需要在循环之外。

  3. 您为每个文件指定了错误的内容类型。

  4. 您正在每次循环迭代中销毁流。

  5. 请改为尝试:

    POSTData := TIdMultipartFormDataStream.Create;
    try
      for i := Low(arquivos) to High(arquivos) do
      begin
        if FileExists(arquivos[i]) then 
        begin
          //AddFile() will choose the content type for you based on the file extension
          POSTData.AddFile('files[]', arquivos[i]);
        end;
      end;
      HTTP.Post('http://localhost/ENVIO/MultUp.php', POSTData);
    finally
      POSTData.Free;
    end;