2015-10-20 303 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