2015-12-26 73 views
-2

目標文件路徑我有捲曲下載功能如下:PHP:fopen()函數

function down($url, $target){ 
    set_time_limit(0); 
    $file = fopen(dirname(dirname(__FILE__)) . $target, 'w+'); 
    $curl = curl_init($url); 
    curl_setopt_array($curl, [ 
     CURLOPT_URL   => $url, 
     CURLOPT_BINARYTRANSFER => 1, 
     CURLOPT_RETURNTRANSFER => 1, 
     CURLOPT_FILE   => $file, 
     CURLOPT_TIMEOUT  => 50, 
     CURLOPT_USERAGENT  => 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)' 
    ]); 
    $response = curl_exec($curl); 

    if($response === false) { 
     throw new \Exception('Curl error: ' . curl_error($curl)); 
    } 
    $response; 
} 

我的劇本是在以下路徑:

爲/引導/ PHP/downloadscript。 PHP

我的目的是要下載的文件存儲在:

爲/引導/發音/

當我運行該腳本,它下載如預期(我還沒有添加路徑pronunciations文件夾還因爲我不知道怎麼的文件到文件夾bootstrap到),但文件名前面加上了文件夾的名稱。因此,如果下載的文件是word1.mp3,則該文件保存爲bootstrapword1.mp3。我怎樣才能使用原始名稱保存文件而不需要任何前置和正確的路徑?

+0

嘗試調試第一... fipen函數的第一個參數複製到電話的var_dump看什麼路徑生成,你就會明白爲什麼你所得到的引導字符串中的文件名 –

+0

它看起來像你我自己回答你的問題,所以我同意downvote。這沒什麼特別的,這是基本的字符串操作,並忘記檢查'var_dump(dirname(__ FILE __))'來查看字符串是否包含所需的尾部斜槓(因爲它沒有)。 –

+0

如果提問者確實發現自己的答案,不知道自己回答問題是錯誤的。這並不像提問者通過回答他們自己的問題而獲得任何代表,所以我不知道他們爲什麼應該受到處罰,但繼續前進。快樂的欺負。我很滿意我有我需要的答案。 :) – TheLearner

回答

0

這條線是問題:

$文件=的fopen(目錄名(目錄名(FILE ))$目標, 'W +');

它更改爲這個固定的問題:

$文件=的fopen(。目錄名(目錄名(FILE)) 「/發音/」 $目標, 'W +');

沒有/fopen()函數,這兩個字符串只不過是被因此串聯起來預謀目錄名文件名。

-1

一個簡單的辦法就是用實際的路徑;)

$file = fopen(__DIR__."/../pronunciations/".$target,'w+'); 

注意兩件事情:

  • 這使用__DIR__不變,這表明當前腳本的目錄。這相當於dirname(__FILE__),但國際海事組織更清晰,更審慎。
  • ..在路徑中表示「父目錄」。是的,你可以在路徑中使用它!所以爲了你的緣故,我希望你已經確保$target是一個有效的文件名!
  • 顯然,如果該目錄不存在,那麼它將失敗。我們可以假定當前目錄存在(否則文件還有多少?),我們可以假定父目錄(..)也存在。但是,我們不應該假設pronunciations存在...

    $dir = __DIR__."/../pronunciations"; 
    if(!file_exists($dir)) { 
        mkdir($dir); 
    } 
    if(!is_dir($dir)) { 
        throw new RuntimeException("Target directory not found"); 
    } 
    

    現在您知道該目錄存在,您可以嘗試寫入它。錯誤處理很重要!