我有一个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 。如何在没有任何前置和正确路径的情况下使用原始名称保存文件?
答案 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");
}
现在您知道该目录存在,您可以尝试写入该目录。错误处理很重要!