从URL下载图片至本地后文件损坏(大小为0B)的解决方法
解决PHP保存图片为空文件(0B)的问题
核心原因分析
文件大小为0B说明没有成功获取到图片的二进制内容,问题出在「远程内容获取」或「本地写入」环节,逐一排查即可解决。
分步排查与修复
1. 确认目标URL有效性
- 直接在浏览器中打开
$_POST["url"]的值,确认能正常显示图片(必须是直接的图片资源,后缀为.jpg/.png/.gif等,而非包含图片的网页链接)。 - 如果URL带查询参数(如
http://xxx.com/img.jpg?token=123),需确保参数有效,不会触发403/404错误。
2. 检查服务器配置与权限
(1)保存目录的权限与存在性
确保all_backend_stuff文件夹存在且有写入权限,可在代码开头添加检查逻辑:
$save_dir = 'all_backend_stuff'; if (!is_dir($save_dir)) { // 递归创建文件夹,权限设为0755(可按需调整) mkdir($save_dir, 0755, true); } if (!is_writable($save_dir)) { die("保存目录无写入权限"); }
(2)PHP扩展与配置检查
- 若使用
file_get_contents:检查php.ini中allow_url_fopen = On,可通过phpinfo()查看配置状态。 - 若使用curl:检查php.ini中
extension=curl已启用,同样用phpinfo()确认。
3. 优化代码并添加错误捕获
(1)优化Curl版本代码(兼容性更强)
添加错误捕获、重定向支持、二进制写入逻辑:
$image_link = $_POST["url"]; $save_dir = 'all_backend_stuff'; // 检查目录 if (!is_dir($save_dir)) { mkdir($save_dir, 0755, true); } if (!is_writable($save_dir)) { die("保存目录无写入权限"); } // 解析URL,避免查询参数干扰文件名 $parsed_url = parse_url($image_link); $image_path = $parsed_url['path']; $split_image = pathinfo($image_path); $file_name = $save_dir . '/' . $split_image['filename'] . '.' . $split_image['extension']; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $image_link); // 使用主流浏览器的User-Agent,避免被反爬拦截 curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 允许跟随重定向 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS, 5); // 临时禁用SSL证书检查(测试用,生产环境建议配置合法证书) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($ch); // 捕获Curl请求错误 if (curl_errno($ch)) { die("Curl请求错误: " . curl_error($ch)); } curl_close($ch); // 以二进制模式写入图片 $file = fopen($file_name, 'wb') or die("无法打开文件"); fwrite($file, $response); fclose($file); echo $file_name;
(2)优化file_get_contents版本代码
添加错误捕获逻辑:
$image_link = $_POST["url"]; $save_dir = 'all_backend_stuff'; // 检查目录 if (!is_dir($save_dir)) { mkdir($save_dir, 0755, true); } if (!is_writable($save_dir)) { die("保存目录无写入权限"); } // 解析URL获取纯净文件名 $loc = $save_dir . '/' . basename(parse_url($image_link)['path']); $content = file_get_contents($image_link); if ($content === false) { $error = error_get_last(); die("获取图片失败: " . $error['message']); } // 二进制写入并加锁 file_put_contents($loc, $content, LOCK_EX); echo $loc;
4. 处理网站反爬拦截
部分网站会通过User-Agent、Referer拦截非浏览器请求:
- 确保User-Agent设置为主流浏览器标识(如上述代码中的Chrome UA)。
- 若仍被拦截,可尝试添加Referer头(Curl版本):
curl_setopt($ch, CURLOPT_REFERER, parse_url($image_link)['scheme'] . '://' . parse_url($image_link)['host']);
内容的提问来源于stack exchange,提问作者user20584755
相关产品推荐
相关产品推荐

