项目场景:
PHP实现远程下载文件到本地
方法描述
保存到服务器中
``/**
* @param $url 下载链接:https://img.pconline.com.cn/images/upload/upc/tx/itbbs/2101/25/c1/251135935_1611532823091_mthumb.jpg
* @param $directory 文件保存目录:E:/phpstudy_pro/WWW/prj/tp5test/public/img/
* @return string
*/
function downloadFileSimplified($url, $directory)
{
// 提取并转换文件名
$fileName = basename($url);
$safeFileName = iconv("UTF-8", "GB2312//IGNORE", urldecode($fileName));
$filePath = rtrim($directory, '/') . DIRECTORY_SEPARATOR . $safeFileName;
$file = @fopen($filePath, 'w+');
if (!$file) {
return "Error:无法创建文件。";
}
// 初始化cURL
$ch = curl_init($url);
if (!$ch) {
fclose($file);
return "Error:无法初始化cURL。";
}
// 设置cURL选项
curl_setopt_array($ch, [
CURLOPT_FILE => $file,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_SSL_VERIFYPEER => false, // 生产环境中建议开启
CURLOPT_SSL_VERIFYHOST => false, // 生产环境中建议开启
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_TIMEOUT => 30,
]);
// 执行请求并检查结果
$success = curl_exec($ch);
$error = curl_error($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// 清理资源
curl_close($ch);
// 关闭文件
fclose($file);
// 根据执行结果处理
if ($success === false) {
unlink($filePath); // 删除可能已部分写入的文件
return "Error:" . $error;
}
if ($httpCode !== 200) {
unlink($filePath);
return "Error:下载失败,HTTP状态码为 $httpCode";
}
return "文件下载成功:" . $filePath;
}
//使用示例
// 定义下载的URL
$url = "https://example.com/path/to/your/file.csv";
// 指定保存文件的本地目录
$saveDirectory = "/path/to/your/local/directory/";
// 调用下载函数
$resultMessage = downloadFileSimplified($url, $saveDirectory);
// 根据函数返回的消息输出结果
if (strpos($resultMessage, "Error") !== false) {
echo "下载失败: " . $resultMessage;
} else {
echo $resultMessage;
}`
---
第二种方法
/**
* @param $url 远程地址:"http://www.baidu.com/img/baidu_jgylogo3.gif"
* @param $path 本地保存目录:/www/wwwroot/dow/
* @return bool
*/
function download_file($url, $path)
{
// 检查路径是否存在,如果不存在则创建
if (!file_exists($path)) {
mkdir($path, 0777, true);
}
// 解码URL中的文件名
$decoded_file = urldecode(basename($url));
// 拼接文件路径
$file_path = rtrim($path, '/') . '/' . mb_convert_encoding($decoded_file, "GB2312", "UTF-8"); // 使用rtrim确保没有尾随斜杠
$file = @fopen($file_path, 'w+');
// 初始化 curl 会话
$ch = curl_init();
// 设置要请求的 URL
curl_setopt($ch, CURLOPT_URL, $url);
// 设置输出文件流
curl_setopt($ch, CURLOPT_FILE, $file);
// 设置请求超时时间(单位:秒)
curl_setopt($ch, CURLOPT_TIMEOUT, 40);
// 启用SSL验证并忽略自签名证书警告(生产环境应使用CA证书验证)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
// 开启重定向跟踪功能
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
// 执行 curl 请求
$result = curl_exec($ch);
// 获取 HTTP 状态码
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// 关闭文件和 curl 会话
curl_close($ch);
fclose($file);
// 如果请求失败或HTTP状态码不是200,删除该文件并返回false
if ($result === false || $httpcode !== 200) {
unlink($file_path);
return false;
}
// 返回true表示下载成功
return true;
}