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

PHP通过FTP向AS400服务器追加写入文件无实际数据问题求助

问题原因分析
  • FTP追加命令使用逻辑错误
    FTP协议的APPE(追加)命令仅用于指定服务器端要追加的目标文件名,本身不会传输本地文件内容。你直接通过ftp_raw发送app 本地路径 远程文件名属于完全错误的命令格式,ftp_raw仅负责发送原始FTP指令,不会自动读取本地文件上传内容,服务器收到非法指令后虽然可能返回通用响应,但实际不会执行写入操作。
  • 返回值判断逻辑错误
    ftp_raw的返回值是服务器响应的数组,只要服务器正常返回响应(不管是成功还是错误响应),返回值都不为假,你当前的判断条件会把所有服务器响应都判定为“执行成功”,完全没有校验FTP返回的状态码是否为2开头的成功状态码,你看到的成功提示完全是误判。
  • AS400 QSYS文件系统适配问题
    AS400的QSYS.LIB文件系统下的物理文件对FTP传输有特殊要求:
    • 未指定正确的传输模式(ASCII/BINARY)会导致内容写入失败,文本类内容一般需要先切换为ASCII模式
    • 操作物理文件时需要确认登录用户对目标文件有*CHANGE及以上权限,若文件被其他作业占用锁定,写入操作可能会被静默丢弃
修正方案

推荐使用PHP官方封装的ftp_append函数完成追加上传,无需手动处理原始FTP命令,修正后代码如下:

// 建立FTP连接
$conn_id = ftp_connect($ftp_server) or die("Couldn't connect to $ftp_server");

// 登录
if (@ftp_login($conn_id, $ftp_user, $ftp_pass)) {
    echo "Connected as $ftp_user@$ftp_server\n";
} else {
    die("Couldn't connect as $ftp_user\n");
}

// 切换到目标目录,用ftp_chdir自带返回值校验更可靠
if (ftp_chdir($conn_id, "/QSYS.LIB/DWFOR800.LIB")) {
    debug("cd /QSYS.LIB/DWFOR800.LIB executed successfully");
} else {
    die("could not execute cd /QSYS.LIB/DWFOR800.LIB");
}

// 开启被动模式,避免防火墙拦截传输链路
ftp_pasv($conn_id, true);

$local_file = CODE_PHP_PATH."test.txt";
$remote_file = "EDI50FTP.FILE";

// 执行追加上传,文本内容使用FTP_ASCII模式,二进制内容替换为FTP_BINARY
if (ftp_append($conn_id, $remote_file, $local_file, FTP_ASCII)) {
    debug("文件内容追加成功");
} else {
    $error = error_get_last();
    debug("追加失败,错误信息:".($error ? $error['message'] : '未知错误'));
}

// 关闭连接
ftp_close($conn_id);
额外排查建议
  • 如果修改后还是写入失败,可以通过print_r(ftp_raw($conn_id, "STAT"))打印FTP服务器状态信息,确认目标文件的权限和占用状态
  • 确认AS400端的EDI50FTP.FILE是可写入的物理文件,逻辑文件、备份文件这类特殊文件不支持FTP追加写入
  • 检查本地test.txt文件是否存在且有可读权限,ftp_append会读取本地文件内容上传,本地文件不可读也会导致写入失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:27:03