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

Unity本地服务器字符串上传失败求助:无法写入目标文件

问题分析与解决方案

核心问题

你的Web服务器默认不允许直接通过PUT请求修改文件,这就是为什么Unity返回上传成功,但服务器实际未写入数据;访问目录返回404是因为服务器未开启目录浏览或无默认索引页。直接用PUT上传的方案几乎不可行(除非修改服务器配置,且安全性极低),推荐用后端脚本(比如PHP)处理上传请求。

推荐方案:PHP脚本处理上传

1. 编写PHP处理脚本

在服务器的Project目录下创建save_data.php文件,内容如下:

<?php
// 仅允许POST请求
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo "Method Not Allowed";
    exit;
}

// 获取Unity传递的字符串内容
$content = $_POST['content'] ?? '';
if (empty($content)) {
    http_response_code(400);
    echo "No content provided";
    exit;
}

// 保存到123.txt,如需覆盖文件去掉FILE_APPEND参数
$savePath = '123.txt';
if (file_put_contents($savePath, $content, FILE_APPEND)) {
    http_response_code(200);
    echo "Data saved successfully";
} else {
    http_response_code(500);
    echo "Failed to save data";
}
?>

2. 修改Unity上传代码

替换原有的Upload协程,改为向PHP脚本发送POST请求:

IEnumerator Upload()
{
    WWWForm form = new WWWForm();
    // 对应PHP脚本中的"content"字段,可替换为JSON字符串
    form.AddField("content", "This is some test data");

    using (UnityWebRequest www = UnityWebRequest.Post("http://localhost/Project/save_data.php", form))
    {
        yield return www.SendWebRequest();

        if (www.result != UnityWebRequest.Result.Success)
        {
            Debug.Log(www.error);
        }
        else
        { 
            ServerResult.text = www.downloadHandler.text;
            Debug.Log(www.downloadHandler.text);
        }
    }
}

3. 配置服务器权限

确保Project目录具备写入权限:

  • Linux/Apache:执行chmod 755 /path/to/Project,生成的123.txt权限设为644
  • Windows/IIS:给IIS_IUSRS用户添加该目录的写入权限

可选:PUT方法配置(不推荐)

如果一定要用Unity的UnityWebRequest.Put,需修改服务器配置开启WebDAV,但此方式安全性极低,易被恶意篡改文件:

Apache

  1. 启用mod_dav模块
  2. 在httpd.conf或.htaccess中添加:
<Directory "/path/to/Project">
    Dav On
    AllowOverride All
    Require all granted
</Directory>

IIS

  1. 安装WebDAV组件
  2. 在站点配置中启用WebDAV并允许PUT请求

验证上传结果

上传完成后,可通过你的下载逻辑访问http://localhost/Project/123.txt,或新增文本下载协程:

IEnumerator DownloadText(string url, Action<string> OnError, Action<string> OnSuccess)
{
    using (UnityWebRequest www = UnityWebRequest.Get(url))
    {
        yield return www.SendWebRequest();
        if (www.result != UnityWebRequest.Result.Success)
        {
            OnError(www.error);
        }
        else
        {
            OnSuccess(www.downloadHandler.text);
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:36:23