1

我想允许用户使用他机器上的本地图像并将其上传到服务器。

我所做的是在游戏中使用 UnityWebRequest,加载图像,将其发送到服务器上的 PHP 文件,然后等待回复以记住文件 si 保存的 URL(稍后将其保存在 Playfab 中)。

这是我到目前为止所做的代码:

private readonly string setAvatarUrl = "http://myurl.com/setavatar.php";

private readonly string playerIdField = "playfabid";
private readonly string imageField = "img_avatar";

public IEnumerator SaveImageToDB(Texture2D image)
    {
        byte[] bytes = image.EncodeToPNG();

        WWWForm form = new WWWForm();
        form.AddField(playerIdField, player.playerId);
        form.AddBinaryData(imageField, bytes, "avatar.png", "image/png");

        UnityWebRequest www = new UnityWebRequest();
        www = UnityWebRequest.Post(setAvatarUrl, form);

        yield return www.SendWebRequest();

        if (www.isNetworkError || www.isHttpError)
        {
            Debug.LogError(www.error);
        }
        else
        {
            string jsonFromDB = www.downloadHandler.text;    // Return empty string
            string imageUrl = JsonUtility.FromJson<string>(jsonFromDB);

            Debug.Log($"JSON returned: {jsonFromDB}");

            if (!string.IsNullOrEmpty(imageUrl))
            {
                // Save the url
            }

            Debug.Log("Image upload complete!");
        }

    }

这是 PHP 文件:

    <?php
ini_set('display_errors',1);
$idplayfab = $_POST['playfabid'];

$path = 'avatar/'.$idplayfab;
if(file_exists($path)) {
    //dir exist
    $files = glob($path.'/*');
    foreach($files as $file){
        if(is_file($file))
            unlink($file);
    }
} else {
    //not exist
    mkdir($path);
}

$uploadfile = $path ."/". basename($_FILES['img_avatar']['name']);
if (move_uploaded_file($_FILES['img_avatar']['tmp_name'], $uploadfile)) {
    $array = array('result' => 'ok', 'url' => 'http://myurl.com/'.$uploadfile);
    $json = json_encode($array);
    return $json;
} else {
    $array = array('result' => 'ko');
    $json = json_encode($array); 
    return $json;
}
?>

图像保存在服务器上,但问题是当我尝试获取 JSON 以获取 URL 时,字符串为空,我不明白为什么。

我尝试了很多解决方案,例如这个这个,但我无法弄清楚。

我也尝试改用已弃用的 WWW,但它仍然不起作用。

我对 PHP 有点陌生,所以我相信这可能是 PHP 部分的问题。

4

1 回答 1

1

不是 PHP 专家,但:

Afaikreturn仅用于评估某些功能,例如是否成功或在响应服务器端的客户端之前进一步处理某些结果。

您想要做的是将您的内容作为 http 结果发送给客户端

=> 你应该使用echoor printwhich 来生成 http 输出。

于 2020-11-12T11:44:51.283 回答