使用 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 帮助解决问题。
我目前正在开发一个 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 帮助解决问题。