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

使用cURL向SFTP服务器上传PDF文件时文件大小为0KB的解决方法

解决cURL上传SFTP时PDF文件大小为0KB的问题

首先纠正一个误解:PDF文件完全可以用fopen()打开,你遇到的0KB文件问题,是代码里的两个关键错误导致的,和文件类型无关。

问题根源

  1. filesize()参数错误:你给CURLOPT_INFILESIZE传了filesize($fh),但filesize()函数需要的是文件路径字符串,不是文件句柄$fh。这会让cURL无法获取正确的文件大小,最终上传空文件。
  2. 文件句柄判断错误:代码里的if ($dataFile)判断的是文件名是否存在,但fopen()可能因为权限、文件损坏等原因失败,应该判断文件句柄$fh是否有效。

修正后的完整代码

$ch = curl_init('sftp://' . $sftpServer . ':' . $sftpPort . $sftpRemoteDir . '/' . basename($dataFile));
$fh = fopen($dataFile, 'r');

// 正确判断文件句柄是否成功打开
if ($fh) {
    curl_setopt($ch, CURLOPT_USERPWD, $sftpUsername . ':' . $sftpPassword);
    curl_setopt($ch, CURLOPT_UPLOAD, true);
    curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
    curl_setopt($ch, CURLOPT_INFILE, $fh);
    // 修正:传入文件路径给filesize()
    curl_setopt($ch, CURLOPT_INFILESIZE, filesize($dataFile));
    curl_setopt($ch, CURLOPT_VERBOSE, true);
    
    $verbose = fopen('php://temp', 'w+');
    curl_setopt($ch, CURLOPT_STDERR, $verbose);
    
    $response = curl_exec($ch);
    $error = curl_error($ch);
    
    curl_close($ch);
    fclose($fh); // 记得关闭文件句柄
    
    if ($response) {
        echo "Success";
    } else {
        echo "Failure";
        rewind($verbose);
        $verboseLog = stream_get_contents($verbose);
        echo "Verbose information:\n" . $verboseLog . "\n";
        fclose($verbose);
    }
} else {
    echo "Failed to open local file: " . $dataFile;
}

额外注意事项

  • 确保$dataFile指向的PDF文件存在,且PHP进程有读取该文件的权限
  • 使用fopen($dataFile, 'r')完全可以读取PDF这类二进制文件,PHP会自动处理二进制流;如果是Windows环境,用rb模式会更稳妥
  • 如果上传仍有问题,查看CURLOPT_VERBOSE输出的日志,里面会包含SFTP交互的详细信息,帮助定位权限、远程路径等问题

内容的提问来源于stack exchange,提问作者Drenyl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:17:24