2015-10-20 308 views
1

我工作的一个程序,我需要通过HTTP将文件上传到Web服务器的Delphi + PHP

我已经搜查,并得到了这一个“的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; 

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

,但没有文件被你的帮助

回答

10

阅读PHP文件上传

感谢。

PHP代码使用$_FILES,其期待客户端在MIME发布一个HTML网页表单multipart/form-data格式:

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); 
?> 
+0

这就是回答我的问题,解决。 – Someone

+0

如果是这样,请将答案标记为已接受。 –

+1

@David Heffernan:我当时没有特权接受答案!先生,你过得不好吗?你投下了我曾经发布在stackoverflow上的所有东西,并给了我政治风格的执行力。 – Someone