Som*_*one 1 php delphi indy delphi-xe
我正在研究一个程序,我需要通过http将'log.txt'上传到网络服务器
我搜索并得到了这个: -
德尔福XE:
procedure TForm1.Button1Click(Sender: TObject);
begin
idhttp1.Post('http://127.0.0.1/GET2.php', 'C:\Users\Someone\Desktop\log.txt')
end;
Run Code Online (Sandbox Code Playgroud)
php: -
<?php
$uploaddir = "uploads/";
$uploadfile = $uploaddir . basename( $_FILES['file']['name']);
if(move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile))
{
echo "The file has been uploaded successfully";
}
else
{
echo "There was an error uploading the file";
}
?>
Run Code Online (Sandbox Code Playgroud)
但没有上传文件
谢谢你的帮助
Rem*_*eau 13
阅读PHP文档.
您的PHP代码正在使用$_FILES,它希望客户端以MIME multipart/form-data格式发布HTML网页表单:
PHP能够从任何符合RFC-1867的浏览器接收文件上载.
但是,这种格式不是您的应用程序实际发布的格式.它只是按原样发布原始文件内容,没有MIME元数据来描述文件.这就是你的PHP代码无法正常工作的原因.
要使用multipart/form-dataHTML 发布HTML表单TIdHTTP.Post(),您必须使用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;
Run Code Online (Sandbox Code Playgroud)
或者,PHP还支持PUT文件上载的HTTP 请求:
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;
Run Code Online (Sandbox Code Playgroud)
<?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);
?>
Run Code Online (Sandbox Code Playgroud)