PHP中通过FTP创建上传新文件且不覆盖旧文件的实现问题
FTP上传相关问题解答
能否实现FTP上传不覆盖已有旧文件
可以实现,常用两种方案:
- 上传前先检测远程文件是否存在:调用
ftp_size()方法传入FTP连接对象和远程文件路径,返回值为-1说明文件不存在,可以正常上传;如果返回数值大于等于0说明文件已存在,可终止上传或给新文件添加时间戳、随机序号等后缀后再执行上传操作。 - 利用FTP的STOU指令自动生成不重名文件:如果你的FTP服务支持STOU命令,可发送指令让服务器自动为上传的文件分配不重复的名称,完全避免覆盖风险。
你当前代码运行失败的原因
ftp_put()函数的第三个参数要求传入本地待上传文件的路径字符串,你当前传入的是$objPHPExcel对象,参数类型不匹配,所以函数无法正常执行。同时你前面生成的newfile.txt也没有在上传逻辑中用到,逻辑不对应。
修正后的代码示例
示例1:上传你之前创建的文本文件
// 生成本地文本文件 $myfile = fopen("newfile.txt", "w") or die("Unable to open file!"); $txt = "John Doe\n"; fwrite($myfile, $txt); $txt = "Jane Doe\n"; fwrite($myfile, $txt); fclose($myfile); // 初始化FTP连接,增加错误判断 $ftp = ftp_connect("web") or die("FTP连接失败"); if(!ftp_login($ftp, "user", "pass")) { die("FTP登录失败"); } // 先检测远程文件是否存在,避免覆盖 $remote_file_path = "Tulassi/tulasi_test.txt"; if(ftp_size($ftp, $remote_file_path) == -1) { // 远程文件不存在,执行上传,第三个参数传本地文件路径 $upload_result = ftp_put($ftp, $remote_file_path, "newfile.txt", FTP_BINARY); echo $upload_result ? "上传成功" : "上传失败"; } else { echo "远程文件已存在,终止上传避免覆盖"; } ftp_close($ftp); exit;
示例2:上传PHPExcel生成的Excel文件
// 先将PHPExcel对象保存为本地临时文件 $local_excel_path = "temp_excel.xlsx"; $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save($local_excel_path); // FTP上传逻辑 $ftp = ftp_connect("web") or die("FTP连接失败"); ftp_login($ftp, "user", "pass") or die("FTP登录失败"); $remote_file_path = "Tulassi/tulasi_test.xlsx"; if(ftp_size($ftp, $remote_file_path) == -1) { $upload_result = ftp_put($ftp, $remote_file_path, $local_excel_path, FTP_BINARY); echo $upload_result ? "上传成功" : "上传失败"; // 上传完成后可删除本地临时文件 unlink($local_excel_path); } else { echo "远程文件已存在,无需重复上传"; } ftp_close($ftp); exit;
内容的提问来源于stack exchange,提问作者sathish
相关产品推荐
相关产品推荐

