阅读 PHP 文档。
您的 PHP 代码正在使用 $_FILES,它希望客户端以 MIME multipart/form-data 格式发布 HTML 网络表单:
Handling file uploads > POST method uploads
PHP 能够从任何符合 RFC-1867 的浏览器接收文件上传。
RFC 1867 Form-based File Upload in HTML
但是,这种格式并不是您的应用程序实际发布的格式。它只是按原样发布原始文件内容,没有 MIME 元数据来描述文件。这就是您的 PHP 代码无法正常工作的原因。
要使用TIdHTTP.Post() 发布multipart/form-data HTML 网络表单,您必须使用TIdMultipartFormDataStream 类,例如:
uses
..., IdHTTP, IdMultipartFormDataStream;
procedure TForm1.Button1Click(Sender: TObject);
var
PostData: TIdMultipartFormDataStream;
begin
PostData := TIdMultipartFormDataStream.Create;
try
PostData.AddFile('file', 'C:\Users\Someone\Desktop\log.txt');
idhttp1.Post('http://127.0.0.1/GET2.php', PostData)
finally
PostData.Free;
end;
end;
另外,PHP 还支持 HTTP PUT 文件上传请求:
Handling file uploads > PUT method support
procedure TForm1.Button1Click(Sender: TObject);
var
FS: TFileStream;
begin
FS := TFileStream.Create('C:\Users\Someone\Desktop\log.txt', fmOpenRead or fmShareDenyWrite);
try
idhttp1.Put('http://127.0.0.1/log.txt', FS);
finally
FS.Free;
end;
end;
<?php
/* PUT data comes in on the stdin stream */
$putdata = fopen("php://input", "r");
/* Open a file for writing */
$fp = fopen("log.txt", "w");
/* Read the data 1 KB at a time
and write to the file */
while ($data = fread($putdata, 1024))
fwrite($fp, $data);
/* Close the streams */
fclose($fp);
fclose($putdata);
?>