php - 如何在 Delphi 中转换 HTML Webform 的参数以与 TIdHTTP 一起使用?

标签 php delphi upload transfer idhttp

如何在 Delphi 中转换 HTML Webform 的参数以与 TIdHTTP 一起使用?

我有一个带有 PHP 的网络服务器,以及上传文件的功能。通过网络浏览器,我可以毫无问题地发送文件,但是当我使用 TIdHTTP 时,它会出现错误。

这是文件上传页面的 HTML:

<html>
<head>
    <title>Upload de Arquivos com PHP</title>
</head>
<body>
     
<form method="post" action="recebe_upload.php" enctype="multipart/form-data">
<label>Arquivo:</label>
<input type="file" name="arquivo" />
<input type="submit" value="Enviar" />
</form>
     
</body>
</html>

这是我用来发送文件的过程:

procedure TForm1.Button1Click(Sender: TObject);
var
  Response, URL : String;
  LHTTPClient : TIdHTTP;
  Lista : TIdMultiPartFormDataStream;
  server, script, caminhoarq : string;
begin
  URL := 'http://192.168.15.101/RECEBE_UPLOAD.php\';
  Lista := TIdMultiPartFormDataStream.Create;
  HTTPClient := TIdHTTP.Create;
  HTTPClient.ProtocolVersion := pv1_1;
  HTTPClient.Request.ContentType := 'utf-8';
  HTTPClient.Request.UserAgent := 'Mozilla/3.0 (compatible;Indy Library)';
  HTTPClient.HTTPOptions := [hoForceEncodeParams, hoKeepOrigProtocol];
  Response := '';
  try
    try
      Lista.AddFormField('Arquivo','C:\Client\teste.txt');
      Response := UTF8Decode(Trim(HTTPClient.Post(URL, Lista)));
      memo1.Lines.add(response);
    except
        on e : exception do
          ShowMessage('Erro ao enviar arquivo ao servidor! Detalhes: '+e.Message);
    end;
  finally
    Lista.Free;
    HTTPClient.free;
  end;
end;

这是我收到的错误消息:

<br />
<b>Notice</b>:  Undefined index: arquivo in <b>C:\xampp\htdocs\RECEBE_UPLOAD.php</b> on line <b>22</b><br />
<br />
<b>Notice</b>:  Undefined index: arquivo in <b>C:\xampp\htdocs\RECEBE_UPLOAD.php</b> on line <b>30</b><br />
<br />
<b>Strict Standards</b>:  Only variables should be passed by reference in <b>C:\xampp\htdocs\RECEBE_UPLOAD.php</b> on line <b>30</b><br />

最佳答案

您没有正确填充TIdMultiPartFormDataStream。您需要使用 AddFile() 方法,而不是 AddFormField() 方法。后者适用于文本字段。

此外,PHP 的 $_POST 在访问 Web 表单字段时区分大小写。 HTML 发送名为 arquivo 的字段,但您的 Delphi 代码发送的是名为 Arquivo 的字段。这就是为什么 PHP 错误显示 arquivo isknown。

此外,您发布到的 URL 是错误的,并且您设置的 ContentType 也是错误的(尽管 Post() 会覆盖它)。

试试这个:

procedure TForm1.Button1Click(Sender: TObject);
var
  Response, URL : String;
  LHTTPClient : TIdHTTP;
  Lista : TIdMultiPartFormDataStream;
begin
  URL := 'http://192.168.15.101/recebe_upload.php';
  Lista := TIdMultiPartFormDataStream.Create;
  try
    Lista.AddFile('arquivo', 'C:\Client\teste.txt');

    HTTPClient := TIdHTTP.Create;
    try
      HTTPClient.ProtocolVersion := pv1_1;
      HTTPClient.HTTPOptions := [hoForceEncodeParams, hoKeepOrigProtocol];
      try
        Response := Trim(HTTPClient.Post(URL, Lista));
        Memo1.Lines.Add(Response);
      except
        on e : Exception do
          ShowMessage('Erro ao enviar arquivo ao servidor! Detalhes: ' + e.Message);
      end;
    finally
      HTTPClient.Free;
    end;
  finally
    Lista.Free;
  end;
end;

关于php - 如何在 Delphi 中转换 HTML Webform 的参数以与 TIdHTTP 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63106850/

相关文章:

php - 特殊字符和 json_encode

php - MySQL - 设置字符串到数字的隐式转换?

PHP curl 错误请求 400 - mapquest 地理编码

delphi - 当字符串中有名称时使用指针

Angular 2 没有将 Content-Type 设置为 'multipart/form-data' 而是设置为 'application/json'

php - 使用 PostGis 的 ST_AsPNG() 输出通过 PHP 创建图像

delphi - 如何检查进程是否属于当前用户?

delphi - 64位Delphi桌面应用程序可以通过Windows 8.1认证吗

PHP Sessions,打印 session 信息的问题

dart - Flutter:使用二进制正文上传图像