2012-06-17 102 views
4

經過幾個小時的研究,我無法解決PHP和cURL的問題。用cURL發送文件

當我嘗試直接從窗體發送文件時,捲曲正常工作。

<form method="post" action="" enctype="multipart/form-data"> 
<input name="file" type="file" /> <br /> 
<input name="submit" type="submit" value="Upload" /> 
</form> 

<?php 
$temp = $_FILES['file']['tmp_name']; 
$name = $_FILES['file']['name']; 

$post = array (
    'file' => '@'. $temp 
); 

$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, $url); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt ($ch, CURLOPT_POST, true); 
curl_setopt ($ch, CURLOPT_POSTFIELDS, $post); 
$exec = curl_exec ($ch); 
curl_close ($ch); 
?> 

上述代碼工作正常。當我嘗試使用您的表單時,文件被正確發送。

我的問題是我需要發送已經在服務器上的文件。

我嘗試了文件「C:/xampp/htdocs/test/photos.zip」的完整路徑,但由於某種原因,不起作用。

$post = array (
    'file' => '@C:/xampp/htdocs/test/photos.zip' 
); 

有誰知道我該如何發送已經發送到服務器的文件?

編輯:

upload.php的(服務器)

<?php 
error_reporting(E_ALL); 
$upload = $_FILES['file']; 
move_uploaded_file($upload['tmp_name'], 'photos.zip'); 
?> 

myuploadtest.php(本地主機)

<form action="" method="post" enctype="multipart/form-data"> 
<input name="file" type="file" /><br /> 
<input name="submit" type="submit" value="Upload" /> 
</form> 

<?php 
$temp = $_FILES['file']['tmp_name']; 
$name = $_FILES['file']['name']; 

$post = array(
    'file' => '@'.$temp 
); 

$url = "http://www.mysite.com/upload.php"; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 
$exec = curl_exec($ch); 
curl_close($ch); 
?> 

uploadcurl.php(本地主機)

<?php 
$post = array(
    'file' => '@C:/xampp/htdocs/test/photos.zip' 
); 

$url = "http://www.mysite.com/upload.php"; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 
$exec = curl_exec($ch); 
curl_close($ch); 
?> 

謝謝提前。

+0

如果你發送的文件已經存在或者是一個上傳臨時文件,PHP根本不會在意。檢查PHP實際上是否可以讀取photos.zip文件,並且如果您已經控制了接收服務器,請查看該端的上傳狀態。 –

+0

好的,令人困惑;服務器到客戶端或客戶端到服務器?你好,Marc。 – craig1231

+0

Hi Marc。是的,我可以閱讀該文件。服務器在這兩種情況下都返回空頁面,但臨時文件正在正確發送。 –

回答

1

這裏是你可能想嘗試:

  • 使用相對路徑,即一個相對於正在運行的PHP腳本的路徑名。

  • 在上面的代碼中,我認爲你錯過了$ url的聲明。

  • 我不太明白問題Does anyone know how I do to send files that have already been sent to the server?你要發送文件到哪個服務器? (本地主機?)

如果相對路徑不起作用,您可以共享您收到的錯誤消息嗎?

+0

在同一目錄嗨,我試圖從我的電腦發送文件到服務器。在這兩種情況下,退貨都是空的,但直接從表單開始工作。 $ url =「http://www.mysite.com/upload.php」; –

+0

你在說'退貨是空的'。出現了幾個問題,你有'mysite.com'上的'error_display = On'嗎?這是一個調試的好方法(不是如果你在生產中)。你能分享upload.php嗎?你在這個腳本中迴應你的成功嗎? – fineTuneFork

+0

jsbin鏈接沒有顯示任何東西(代碼被html註釋掉了),但無論如何,它的3行腳本沒有輸出,它只執行該功能。所以,我認爲,它會移動文件,並沒有給你任何輸出。嘗試'if(empty($ _ FILE ['file'])){echo'file is empty or no such';} else {// process}'以供參考。其次,我不確定是否給出一個'文件'作爲參數名是讓curl知道這是否是一個文件的正確方法。基於這個問題有很多問題,如果我找到它,會讓你知道。 – fineTuneFork

1

要發送一個文件,該文件已經在服務器上,憑藉其在服務器上的完整路徑找到它:

$post = array(
    'file' => '@'. $_FILES['file']['tmp_name'] 
); 

這是你在第一時間做了什麼。