Я использую Unity, чтобы сделать кнопку, которая делает снимок экрана, а затем загружает его на мой сервер.
Дело в том, что если я отправлю форму на сервер, WWW выдаст мне Внутреннюю ошибку сервера.
Я пробовал много примеров из интернета, и это все еще дает мне эту ошибку. Каждый раз.
Это мой код C # для загрузки скриншота:
IEnumerator uploadPhoto(){
/*yield return new WaitForEndOfFrame();
Texture2D snap = new Texture2D (webCamTexture.width, webCamTexture.height);
snap.SetPixels (webCamTexture.GetPixels ());
snap.Apply ();
webCamTexture.Stop();*/
yield return new WaitForEndOfFrame();
Texture2D snap = new Texture2D(Screen.width, Screen.height);
snap.ReadPixels(new Rect(0,0,Screen.width,Screen.height),0,0);
snap.Apply();
byte[] bytes = snap.EncodeToPNG();
WWWForm form = new WWWForm();
form.AddField("username", PlayerPrefs.GetString("username"));
form.AddBinaryData("form_file", bytes, "screenshot.png", "image/png");
//Debug.Log(System.BitConverter.ToString(bytes));
WWW connection = new WWW(url, form);
yield return connection;
if (connection.error != null)
{
Debug.Log("Server-side error: " + w.error);
}
else
{
Debug.Log(connection.text);
}
}
И это PHP-скрипт, созданный для получения этих BinaryData:
if ($_POST){
if ($_FILES["form_file"]["error"] !== UPLOAD_ERR_OK) {
die("Upload failed with error code " . $_FILES["form_file"]["error"]);
} else {
if ((($_FILES["form_file"]["type"] == "image/jpg") || ($_FILES["form_file"]["type"] == "image/jpeg") || ($_FILES["form_file"]["type"] == "image/png")) && ($_FILES["form_file"]["size"] < 20000000000)){
if ($_FILES["form_file"]["error"] > 0) {
echo "File error: " . $_FILES["form_file"]["error"] . "";
}else{
echo "Uploaded image: " . $_FILES["form_file"]["name"] . "<br>";
echo "Type: " . $_FILES["form_file"]["type"] . "<br>";
echo "Size: " . ($_FILES["form_file"]["size"] / 1024) . " Kb<br>";
echo "Temporary name: " . $_FILES["form_file"]["tmp_name"] . "<br>";
if (file_exists("upload/" . $_FILES["form_file"]["name"])){
echo $_FILES["form_file"]["name"] . " already exists. ";
}else{
move_uploaded_file($_FILES["form_file"]["tmp_name"], "upload/" . $_FILES["form_file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["form_file"]["name"];
}
}
} else{
echo "Invalid file";
}
}
} else{
echo "No POST. ";
}
Я не знаю, что с этим не так. Я пытаюсь сделать эту работу в течение 2 дней.
Я просто знаю, что ошибка на стороне сервера. Я пытался изменить разрешения скрипта на 777, безрезультатно.
Что я делаю неправильно?
Скопировал ваш php код на мой сервер и пришел к выводу, что проблема с вашего сервера. это не настроить правильно, или это проблема с правами доступа, что также означает, что он не настроен должным образом.
С php в вашем вопросе я получил сообщение с моего тестового сервера:
Uploaded image: screenshot.png<br>Type: image/png<br>Size: 1.494140625 Kb<br>Temporary name: C:\Windows\Temp\php1354.tmp<br>Stored in: upload/screenshot.png
Когда побежал на ваш сервер, я получил:
Server-side error: 500 Internal Server Error
PHP-код, который я использовал:
<?php
if ($_POST){
if ($_FILES["form_file"]["error"] !== UPLOAD_ERR_OK) {
die("Upload failed with error code " . $_FILES["form_file"]["error"]);
} else {
if ((($_FILES["form_file"]["type"] == "image/jpg") || ($_FILES["form_file"]["type"] == "image/jpeg") || ($_FILES["form_file"]["type"] == "image/png")) && ($_FILES["form_file"]["size"] < 20000000000)){
if ($_FILES["form_file"]["error"] > 0) {
echo "File error: " . $_FILES["form_file"]["error"] . "";
}else{
echo "Uploaded image: " . $_FILES["form_file"]["name"] . "<br>";
echo "Type: " . $_FILES["form_file"]["type"] . "<br>";
echo "Size: " . ($_FILES["form_file"]["size"] / 1024) . " Kb<br>";
echo "Temporary name: " . $_FILES["form_file"]["tmp_name"] . "<br>";
if (file_exists("upload/" . $_FILES["form_file"]["name"])){
echo $_FILES["form_file"]["name"] . " already exists. ";
}else{
move_uploaded_file($_FILES["form_file"]["tmp_name"], "upload/" . $_FILES["form_file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["form_file"]["name"];
}
}
} else{
echo "Invalid file";
}
}
} else{
echo "No POST. ";
}
?>
Когда я использовал form.AddField("username", PlayerPrefs.GetString("username"));
на вашем сервере я получил Upload failed with error code
, После включения form.AddBinaryData("form_file", bytes, "screenshot.png", "image/png");
Я получил сообщение об ошибке 500.
Это большой признак того, что у вас нет прав на чтение и запись файла. Также изображение было написано C:\Windows\Temp\php1354
на моем сервере. Вы должны изменить свой PHP-код, чтобы писать куда-то еще вместо C:\Windows\Temp\php1354 directory
, Я бы посоветовал вам связаться с вашим хостом, чтобы изменить разрешение. Это проблема с сервером. Не ошибка Unity или PHP-кода.
Других решений пока нет …