PHP:fopen()中的目标文件路径

时间:2015-12-26 17:56:56

标签: php curl fopen

我有一个cURL下载功能如下:

$.post('executeSearch',{keywords: keywords},function(markup){
   console.log('Test2 passed');
   $('#search-results').html(markup);
});

我的脚本位于以下路径:

  

A-S /引导/ PHP / downloadscript.php

我的目标是将下载的文件存储在:

  

A-S /引导/发音/

当我运行此脚本时,它会按预期将文件下载到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; } 文件夹(我还没有添加bootstrap文件夹的路径,因为我不知道如何)但是文件名前面加上文件夹的名称。因此,如果下载的文件是 word1.mp3 ,则文件将另存为 bootstrapword1.mp3 。如何在没有任何前置和正确路径的情况下使用原始名称保存文件?

2 个答案:

答案 0 :(得分:0)

这一行是问题所在:

  

$ file = fopen(dirname(dirname( FILE ))。$ target,'w +');

将其更改为此修复问题:

  

$ file = fopen(dirname(dirname( FILE ))。“/发音/”。   $ target,'w +');

没有 fopen()中的/,这两个字符串只是被连接在一起,因此文件名带有前置目录名。

答案 1 :(得分:-1)

更简单的解决方案是使用实际路径;)

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

请注意以下几点:

  • 这使用__DIR__常量,表示当前脚本的目录。它等同于dirname(__FILE__),但IMO更清晰,更慎重。
  • 路径中的
  • ..表示"父目录"。是的,你可以在路径中使用它!因此,为了您的利益,我希望您确保$target是有效的文件名!!
  • 显然,如果该目录不存在,那么它将失败。我们可以假设当前目录存在(否则文件还有什么?)我们可以假设父目录(..)也存在。但是,我们不应该假设pronunciations存在...

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

    现在您知道该目录存在,您可以尝试写入该目录。错误处理很重要!