Попытка загрузить файл .png в веб-каталог - PullRequest
2 голосов
/ 24 мая 2019

Я пытаюсь использовать Unity для загрузки файла .png в определенную веб-папку. Проблема может быть в 1 из 3 вещей.

1) Я не смог найти файл php.ini на godaddy. Так может ли быть, что папка не настроена для загрузки?

2) Я никогда не делал этого в Unity, поэтому это может быть проблемой с моим кодом. (он возвращает сообщение о том, что мой файл не может быть загружен, поэтому он проверяет файл .php)

3) Это может быть также и мой php-код, но я не уверен, что я правильно адаптировал пример.

Я читал другие примеры, но я просто не уверен, где моя проблема даже в том, что я должен исправить. Любой совет будет потрясающим.

Unity:

public IEnumerator UploadTicketImage()
{
    byte[] FileUpload = File.ReadAllBytes(Path.Combine(Application.persistentDataPath 
        + "/TicketInformation/", "Pic001.png"));

    WWWForm TextureForm = new WWWForm();
    //TextureForm.AddBinaryData(PlayerPrefs.GetString("ImageName"), FileUpload);
    TextureForm.AddBinaryData("TotalTest", FileUpload, Path.Combine(Application.persistentDataPath 
        + "/TicketInformation/", "Pic001.png"),"image/png");

    UnityWebRequest wwwimageupload = UnityWebRequest.Post(StaticVars.IPAddress+ "/UploadTicketsImage.php?", TextureForm);

    wwwimageupload.uploadHandler = (UploadHandler)new UploadHandlerRaw(FileUpload);
    //wwwimageupload.chunkedTransfer = false;

    yield return wwwimageupload.SendWebRequest();
    Debug.Log(wwwimageupload.downloadHandler.text);
}

PHP

<?php
$target_dir = "PhotoDeposit/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
        echo "File is an image - " . $check["mime"] . ".";
        $uploadOk = 1;
    } else {
        echo "File is not an image.";
        $uploadOk = 0;
    }
}
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
    } else {
        echo "Sorry, there was an error uploading your file.";
    }
?>

1 Ответ

0 голосов
/ 24 мая 2019

Я уже ожидал, что он не найдет файл изображения, который вы хотите загрузить правильно.

Path.Combine(Application.persistentDataPath + "/TicketInformation/", "Pic001.png")

приводит к пути, подобному

                   |                 |
                   v                 v

C:\path\to\project\/TicketInformation/\Pic001.png

на окнах или

                 |                  |
                 v                  v

/path/to/project//TicketInformation//Pic001.png

на Linux или Android.

Его лучше использовать как

Path.Combine(Application.persistentDataPath, "TicketInformation", "Pic001.png")

и

Path.Combine(Application.persistentDataPath, "TicketInformation")

Следующий пункт: почему вы даже используете UploadHandlerRaw, когда вы уже добавили данные в WWWForm, так что мне кажется, что это не имеет большого смысла.

Вы должны удалить строку

wwwimageupload.uploadHandler = (UploadHandler)new UploadHandlerRaw(FileUpload);

Также обратите внимание, что File.ReadAllBytes работает только на платформах Windows, поэтому в зависимости от цели сборки может потребоваться изменить способ чтения файла. Вы можете использовать UnityWebRequestTexture.GetTexture также для чтения локальных файлов. Что-то вроде

public IEnumerator UploadTicketImage()
{
    var folderPath = Path.Combine(Application.persistentDataPath, "TicketInformation");
    var filepath = Path.Combine(folderPath, "Pic001.png");

    byte[] FileUpload = null;

    using (var www = UnityWebRequestTexture.GetTexture(filepath))
    {
        yield return www.SendWebRequest();
        if (www.isNetworkError || www.isHttpError)
        {
            Debug.LogErrorFormat(this, "File loading failed with {0} - {1}", www.responseCode, www.error);
            Debug.LogErrorFormat(this, "Couldn't read file at {0}", filepath);
            yield break;
        }
        else
        {
            // file data successfully loaded
            FileUpload = www.downloadHandler.data;
        }
    }

    var form = new WWWForm();
    // here you want the name the file should have on the server
    // not a complete system path to file on your local device
    //                                          |
    //                                          |
    //                                          |
    // And this is the field you will have      |
    // to access in php                         |
    //                  |                       |
    //                  v                       v
    form.AddBinaryData("TotalTest", FileUpload, "Pic001.png", "image/png");

    using (var www = UnityWebRequest.Post("https://111.111.111.1" + "/UploadTicketsImage.php?", form))
    {
        yield return www.SendWebRequest();

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

Наконец, я не эксперт по PHP. Afaik, вам нужно будет получить доступ к отправленному полю, например

$_FILES['TotalTest']

так вы называете поле TotalTest в form.AddBinaryData.

Также

if(isset($_POST["submit"]))

, вероятно, никогда не соответствует действительности, поскольку вы не установили его в WWWForm (я могу ошибаться, и он устанавливается автоматически при отправке запроса).


Примечание: напечатано на смартфоне, поэтому никаких гарантий, но я надеюсь, что идея проясняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...