将文件上传到Web服务器Delphi + php

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网页表单:

处理文件上传 > POST方法上传

PHP能够从任何符合RFC-1867的浏览器接收文件上载.

RFC 1867基于表单的HTML文件上载

但是,这种格式不是您的应用程序实际发布的格式.它只是按原样发布原始文件内容,没有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 请求:

处理文件上传 > PUT方法支持

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)