Lonely World Geschrieben 28. Januar 2019 Melden Share Geschrieben 28. Januar 2019 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 More sharing options...
Sascha Geschrieben 28. Januar 2019 Melden Share Geschrieben 28. Januar 2019 Ich bin mir nicht sicher, wie $_FILES funktioniert, ehrlich gesagt. Probiere mal aus, die Bytes aus $_POST auszulesen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Lonely World Geschrieben 28. Januar 2019 Autor Melden Share Geschrieben 28. Januar 2019 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 More sharing options...
Sascha Geschrieben 28. Januar 2019 Melden Share Geschrieben 28. Januar 2019 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 More sharing options...
runner78 Geschrieben 28. Januar 2019 Melden Share Geschrieben 28. Januar 2019 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 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 More sharing options...
Lonely World Geschrieben 29. Januar 2019 Autor Melden Share Geschrieben 29. Januar 2019 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 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 More sharing options...
MaZy Geschrieben 29. Januar 2019 Melden Share Geschrieben 29. Januar 2019 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 More sharing options...
MaZy Geschrieben 29. Januar 2019 Melden Share Geschrieben 29. Januar 2019 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 More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.