如何调试.NET调用Chilkat.Upload时PHP端move_uploaded_file失效问题
问题1:将print_r($_FILES);加入PHP代码输出错误的正确方式
你可以在文件写入逻辑前后加入print_r输出,配合PHP的error_log方法还可以把错误同步输出到服务端日志文件,方便多端排查,修改后的参考代码如下:
<?php // 开启所有错误上报,优先定位PHP语法/配置层面的问题 error_reporting(E_ALL); ini_set('display_errors', 1); // 输出$_FILES完整内容到接口返回流 print_r($_FILES); // 同时输出到服务端错误日志,不需要调用接口也能在服务器直接查看 error_log(print_r($_FILES, true)); // 先判断上传阶段有没有系统级错误,避免操作不存在的临时文件 if ($_FILES['file']['error'] !== UPLOAD_ERR_OK) { echo "上传失败,系统错误码:" . $_FILES['file']['error']; exit; } $target_path = "uploads/" . basename($_FILES["file"]["name"]); if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_path)) { echo "Uploaded"; } else { // 额外输出目标路径和目录权限,方便排查权限问题 echo "文件写入失败。目标路径:" . $target_path . " 上传目录权限:" . decoct(fileperms("uploads/")); } ?>
这里额外加了basename处理文件名,避免路径遍历安全问题,同时提前判断上传错误码,能直接定位是文件大小超限、临时目录不可写等系统级错误。
问题2:Chilkat.Upload接收服务端返回错误的方法
Chilkat.Upload组件提供了ResponseBody属性,上传完成后可以直接读取到服务端返回的所有内容,你可以在原来的VB代码里新增读取该属性的逻辑即可,修改后的参考代码如下:
Dim _Chil As New Chilkat.Upload _Chil.Ssl = True _Chil.Hostname = "www.mydomain.com" _Chil.Path = "/upload.php" _Chil.AddFileReference("file", PathToFileThatShouldBeUploaded) Dim bUploadStarted As Boolean = _Chil.BeginUpload() If Not bUploadStarted Then MessageBox.Show("启动上传失败: " & NewLines(2) & _Chil.LastErrorText) Return End If Do While _Chil.UploadInProgress _Chil.SleepMs(200) Loop ' 新增逻辑:读取服务端返回的所有内容,包含你输出的调试信息 Dim serverResponse As String = _Chil.ResponseBody MessageBox.Show("服务端返回内容:" & NewLines(2) & serverResponse) Dim bSuccess As Boolean = _Chil.UploadSuccess If Not bSuccess Then MessageBox.Show("上传错误: " & NewLines(2) & _Chil.LastErrorText & NewLines(2) & "服务端返回:" & serverResponse) Else MessageBox.Show("上传完成. :-)") End If
升级到最新版Chilkat后不再卡住的场景下,也可以直接在上传结束后读取ResponseBody属性,就能拿到PHP输出的print_r($_FILES)内容和所有错误提示。
额外排查建议
主机升级PHP版本后常见的上传失败原因还有:
php.ini里的upload_max_filesize、post_max_size配置被改小,超过大小的文件上传直接被系统拦截upload_tmp_dir配置的临时目录权限变更,PHP进程没有读写权限- 上传目标目录
uploads的权限配置变更,PHP进程没有写入权限
内容的提问来源于stack exchange,提问作者tmighty
相关产品推荐
相关产品推荐

