2015-12-26 3 views
-2

У меня есть завиток скачать функцию следующим образом:PHP: Target путь к файлу в 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

Моя цель состоит в том, чтобы сохранить загруженный файл по адресу:

в/бутстраповском/произношении/

Когда я запускаю этот скрипт, он загружает файл в папку bootstrap, как ожидалось (я не добавил пути к папке pronunciations еще потому, что я не знаю, как to), но имя файла добавляется с именем папки. Таким образом, если загруженный файл word1.mp3, файл сохраняется как bootstrapword1.mp3. Как я могу сохранить файл с исходным именем без предварительного и правильного пути?

+0

Попробуйте отладить первый ... Скопируйте первый аргумент функции fipen в var_dump вызов, чтобы увидеть, что путь формирования и вы поймете, почему вы получаете самозагрузки строки в имени файла –

+0

Это выглядит, как вы «Я сам отвечаю на ваш вопрос, поэтому я согласен с нижним рейтингом. Это ничего особенного, это базовые манипуляции с строкой и забывание проверить «var_dump (dirname (__ FILE __))», чтобы увидеть, содержит ли строка требуемую конечную косую черту (потому что это не так). –

+0

Не знал, что неправильно отвечать на вопрос, если он действительно найдет ответ самостоятельно. Это не похоже на то, что искатель получает какие-либо повторители, отвечая на свой вопрос, поэтому я не знаю, почему они должны наказываться, но идти вперед. Счастливое издевательство. Я доволен, что у меня есть ответ, который мне нужен. :) – TheLearner

ответ

0

Эта линия была проблема:

$ File = Еореп (. Имя_директории (имя_директории (FILE)) $ целевой, 'ш +');

Изменение его на это исправили проблему:

$ File = FOPEN (.. Dirname (имя-каталога (FILE)) "/ произношения /" $ целевой, 'ш +');

Без / в 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"); 
    } 
    

    Теперь вы знаете, что каталог существует, и вы можете попытаться написать ему. Важное значение имеет обработка ошибок!

Смежные вопросы