使用 C#(Unity 游戏引擎)中的 PHP 将照片保存到服务器

Saving photo to server with PHP from C# (Unity Game Engine)

我目前正在开发一个 Unity 游戏引擎项目,在该项目中,我使用 PHP 从游戏中用户的本地计算机将照片发送到 Web 服务器。我的目标是将文件路径存储在数据库中,并将实际图像存储在服务器上的子目录中。

我可以从 Unity 成功发送照片,PHP 脚本正在获取有关照片的信息(文件名、大小、tmp_name)。但是,我无法将照片实际存储在服务器上。

C#统一代码

IEnumerator SendFile(byte[] imageData, string path)
    {

        WWWForm form = new WWWForm();
        string filename = Path.GetFileName(path);
        string filepathname = Data_Manager.steamID + "-" + Data_Manager.steamName + "-" + filename;


        form.AddBinaryData("userImage", imageData, filepathname, "image/png");
        form.AddField("steamID", Data_Manager.steamID);
        form.AddField("steamName", Data_Manager.steamName);

        using (UnityWebRequest www = UnityWebRequest.Post("http://www.roastpartygame.com/database/storeImage.php", form))
        {
            yield return www.SendWebRequest();

            if (www.isNetworkError || www.isHttpError)
            {
                Debug.Log(www.error);
            }
            else
            {
                // Print response
                Debug.Log(www.downloadHandler.text);
            }
        }
    }

上面的代码按预期工作,我从 PHP 回显的任何内容都使用上面代码中的 "Debug.Log(www.downloadHandler.text);" 记录在 Unity 游戏中。

PHP

        $fileName = $_FILES['userImage']['name']; 
        $target = 'images/'.$fileName;

        //$base64decodedString = base64_decode(urldecode($_FILES['userImage']));
        //file_put_contents($target, file_get_contents($_FILES['userImage']['name']));

        if (copy($_FILES['userImage']['tmp_name']), $target) echo 'MOVED FILE!';
        if (move_uploaded_file($_FILES['userImage']['tmp_name'], $target)) echo 'MOVED FILE!';

我玩过复制和 move_uploaded_file。我也尝试过使用 base64,但我在从 Unity 的 C# 脚本中使用 base64 发送照片时遇到问题。当从 PHP 页面中的表单提交照片时,这非常简单。

有人对如何将图像存储到服务器有任何建议吗?

附加代码(在 C# Unity 中抓取照片数据):

public void DirectImageFolder()
    {
        FileBrowser.SetFilters(true, new FileBrowser.Filter("Images", ".jpg", ".png"));
        FileBrowser.SetDefaultFilter(".jpg");
        FileBrowser.SetExcludedExtensions(".lnk", ".tmp", ".zip", ".rar", ".exe");

        FileBrowser.AddQuickLink("Users", "C:\Users", null);
        //FileBrowser.ShowLoadDialog((path) => {
            // Check if photo selected

        //},
        //() => { Debug.Log("Canceled"); },
        //false, null, "Roast Party: Select Image", "Select");

        StartCoroutine(ShowLoadDialogCoroutine());
    }

    IEnumerator ShowLoadDialogCoroutine()
    {
        // Show a load file dialog and wait for a response from user
        // Load file/folder: file, Initial path: default (Documents), Title: "Load File", submit button text: "Load"
        yield return FileBrowser.WaitForLoadDialog(false, null, "Roast Party: Load Image", "Load Image");

        // Dialog is closed
        // Print whether a file is chosen (FileBrowser.Success)
        // and the path to the selected file (FileBrowser.Result) (null, if FileBrowser.Success is false)
        Debug.Log(FileBrowser.Success + " " + FileBrowser.Result);

        // upload image to server
        if (FileBrowser.Success)
        {
            // If a file was chosen, read its bytes via FileBrowserHelpers
            // Contrary to File.ReadAllBytes, this function works on Android 10+, as well
            byte[] bytes = FileBrowserHelpers.ReadBytesFromFile(FileBrowser.Result);

            //send the binary data to web server
            StartCoroutine(SendFile(bytes, FileBrowser.Result));
        }
    }

正在使用自定义 unity 插件来抓取照片数据。

编辑: 我将 "ini_set('display_errors',1); " 添加到 PHP,我现在在 Unity 中收到此消息。

警告:复制(images/76561198086846783-Fraccas-au.jpg):无法打开流:/hermes/walnaweb05a/b2967/moo.devfraccascom/roastparty/database/storeImage.[=61= 中没有此类文件或目录] 第 11 行

没有正确设置我的目标路径的简单错误。我需要退出我所在的目录,然后进入图像文件夹。

if(isset($_FILES['userImage'])) { 
        $fileName = $_FILES['userImage']['name']; 
        $target = '../images/'.$fileName;

        if (copy($_FILES['userImage']['tmp_name'], $target)) echo 'MOVED FILE!';
}

"$target = '../images/'.$fileName;" 而不是 "$target = 'images/'.$fileName ;"

用于从网站上传照片的旧 php 文件与图像文件夹位于同一目录中,我没有意识到这个错误。

感谢@derHugo 帮助解决问题。