使用cURL向SFTP服务器上传PDF文件时文件大小为0KB的解决方法
解决cURL上传SFTP时PDF文件大小为0KB的问题
首先纠正一个误解:PDF文件完全可以用fopen()打开,你遇到的0KB文件问题,是代码里的两个关键错误导致的,和文件类型无关。
问题根源
filesize()参数错误:你给CURLOPT_INFILESIZE传了filesize($fh),但filesize()函数需要的是文件路径字符串,不是文件句柄$fh。这会让cURL无法获取正确的文件大小,最终上传空文件。- 文件句柄判断错误:代码里的
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
相关产品推荐
相关产品推荐

