Jump to content
Unity Insider Forum

C# und PHP Upload


Lonely World

Recommended Posts

Hallo Leute,

ich versuche einen Dateiupload hinzukriegen. Der soll später dazu dienen, einen Spielstand auf einem Webserver zu speichern.

Ich habe ein simples C# script ( Beispiel aus dem Internet) welche eine Routine ausführt. In dieser wird eine Datei geladen und danach zu einem Form hinzugefügt.

PHP-seitig habe ich eine einzige Zeile um zu testen, ob es funktioniert.

 

   IEnumerator UploadFileCo(string localFileName, string uploadURL)
    {
        WWW localFile = new WWW("file:///" + localFileName);
        print(localFile.url);
        yield return localFile;
        if (localFile.error == null)
            Debug.Log("Loaded file successfully");
        else
        {
            Debug.Log("Open file error: " + localFile.error);
            yield break; // stop the coroutine here
        }
        WWWForm postForm = new WWWForm();
        // version 1
        //postForm.AddBinaryData("theFile",localFile.bytes);
        // version 2
        postForm.AddBinaryData("theFile", localFile.bytes, "test.txt", "application/octet-stream");
        WWW upload = new WWW(uploadURL, postForm);
        yield return upload;
        if (upload.error == null)
            Debug.Log("upload done :" + upload.text);
        else
            Debug.Log("Error during upload: " + upload.error);
    }

 

 

 

Hier das php script:

 

<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

 

       move_uploaded_file($_FILES['theFile']['tmp_name'], "../persistant_data/" . "test.txt");


 
?>

Nur leider bekomme ich immer den Fehler:


Undefined index: theFile in /var/www/vhosts/hosting114445.a2f69.netcup.net/httpdocs/upload.php on line 11

 

Wohlmöglich werden keine Daten angehängt. Hat jemand eine Idee?

PHP Settings sind eigentlich alle OK. Max Size usw. groß genug. Es gibt auch schreibrechte usw.

Ich verstehe nur nicht, wieso theFile null ist?

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 20 Minuten schrieb Sascha:

Ich bin mir nicht sicher, wie $_FILES funktioniert, ehrlich gesagt. Probiere mal aus, die Bytes aus $_POST auszulesen.

Anders vielleicht gefragt - ich Versuche ein savegame auf einem webserver zu speichern und dann wieder bei bedarf zu laden. Gibts da vllt ne schlauere Lösung?

Benutze Unet und habe 2 Server

Einmal webhosting und rootserver.

Sollte ich vielleicht per unet zum Gameserver senden und dieser speichert sich das selber ab ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ist schon sicherer, wenn der Server Autorität hat und entsprechend das Sagen über den Spielstand hat. Vor allem, wenn du ihn sowieso online speicherst. Gibt ja auch Offline-Spielstände (Vgl. Borderlands, Monster Hunter World), aber wenn du schon online speicherst, warum dann den (unsicheren) Umweg über den Client gehen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mit var_dump() oder var_export() kannst du dir den Inhalt von $_FILES ausgeben, praktisch für schnelles debuggen.

Ich hoffe du baust da auch eine Validierung ein, die speicherst eine Datei ohne zu überprüfen ab, da kann alles drin sein, und dazu hast du auch indirekt den Link zu deinem Script hier gepostet. Ich habe zum Test eine Textdatei gepostet, gab keine Fehler :ph34r:

Das WWW System von unity ist veraltet, es gibt ein neueres System: https://docs.unity3d.com/Manual/UnityWebRequest-SendingForm.html

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 9 Stunden schrieb runner78:

Mit var_dump() oder var_export() kannst du dir den Inhalt von $_FILES ausgeben, praktisch für schnelles debuggen.

Ich hoffe du baust da auch eine Validierung ein, die speicherst eine Datei ohne zu überprüfen ab, da kann alles drin sein, und dazu hast du auch indirekt den Link zu deinem Script hier gepostet. Ich habe zum Test eine Textdatei gepostet, gab keine Fehler :ph34r:

Das WWW System von unity ist veraltet, es gibt ein neueres System: https://docs.unity3d.com/Manual/UnityWebRequest-SendingForm.html

Danke dir nochmal

Ja ich weiß, das ist alles zum testen gewesen ohne Validierung und co.

Ich denke ich werde es über den Gameserver machen. Der ist sowieso schon mit unity betrieben also viel einfacher. So hätte ich nur 1 weg.

Die ganzen saves landen also auf dem Rootserver

Anmeldedaten sowie login usw alles auf dem Webserver.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich hab mit PHP (nichts mit unity) sowas gemacht und da hab ich das hier stehen(gekürzt):

<form enctype="multipart/form-data" method="post">  

hast ja application/octet-stream ja stehen. Weiß nicht ob da unterschied macht.

2.
Du solltest mit isset usw die Variable erst mal checken.
Ein Beispiel von mir:
 

<?php
if (isset($_FILES) and isset($_FILES['userfile']) ) {
	if(UploadIsOk($_FILES['userfile']['error'])) {
		$filename = pathinfo($_FILES['userfile']['name'], PATHINFO_FILENAME);
		$extension = pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION);
		
      		move_uploaded_file(....

usw.

Ansonsten var_dump ist wirklich wichtig und eine gute Idee das anzuwenden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Weil es mich selbst interessiert hab ich mir das mal angeguckt. WWWPost ist veraltet. Man soll UnityWebRequest benutzen.

So sieht mein code aus:

    void Start()
    {
        StartCoroutine(Upload());
    }

    IEnumerator Upload() {
        var url = @"URL_TO_UPLOAD";
        var fileName = "myfile.txt";
        var fileContent = System.IO.File.ReadAllBytes(@"assets\myfile.txt");
        var fieldName = "userfile";

        WWWForm form = new WWWForm();
        form.AddBinaryData(fieldName, fileContent, fileName);

        UnityWebRequest www = UnityWebRequest.Post(url, form);
        yield return www.SendWebRequest();

        if(www.isNetworkError || www.isHttpError) {
            Debug.Log(www.error); 
        }
        else {
            Debug.Log("Form upload complete!");
            Debug.Log(www.downloadHandler.text);
        }
    }

Etwas den code anpassen und den fieldName zu deinem ändern dann sollte es funktionieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...