将文件上传至Web服务器 Delphi + PHP

4
我正在编写一个程序,需要通过http将“log.txt”上传到web服务器。
我已经搜索了一下,找到了以下内容:
Delphi XE:
procedure TForm1.Button1Click(Sender: TObject);
begin
idhttp1.Post('http://127.0.0.1/GET2.php', 'C:\Users\Someone\Desktop\log.txt')
end;

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";
}
?>

但没有文件被上传

谢谢你的帮助

1个回答

17

阅读PHP文档。

你的PHP代码正在使用 $_FILES,它期望客户端以MIME multipart/form-data 格式发布HTML Web表单:

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

PHP能够从任何符合RFC-1867标准的浏览器接收文件上传。

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

但是,你的应用程序实际上没有以这种格式进行发布。 它只是原样发布原始文件内容,没有MIME元数据来描述文件。 这就是为什么你的PHP代码不起作用的原因。

要使用TIdHTTP.Post()发布multipart/form-data HTML web表单,你必须使用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请求上传文件:

处理文件上传 > 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;
<?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);
?> 

这回答了我的问题,已解决。 - Someone
1
@David Heffernan: 那时我没有接受答案的特权!!先生,你今天心情不好吗?你在stackoverflow上对我发布的所有内容都进行了负面评价,并给出了政治风格的借口。 - Someone
你可以随时接受答案。感谢您完成这个问题。 - David Heffernan
嗨,我尝试了这些代码,它们可以工作。但输出总是log.txt,有没有办法使输出文件跟随原始源名称? - Mirana chan
@Miranachan 当使用 $_FILES 进行 POST 时,源文件名在 $_FILES['fieldName']['name'] 中,详见我在回答中提供的文档。当使用 fopen("php://input") 进行 PUT 时,源文件名在 $_SERVER['REQUEST_URI'] 中,你需要解析出文件名,参考Get only filename from url in php without any variable values which exist in the url - Remy Lebeau
@RemyLebeau 谢谢您的回复。好的,我会查看那些参考资料。 - Mirana chan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接