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

如何调试.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 06:51:01