You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:51:02