Jump to content
Unity Insider Forum

Problem mit C#/PHP File Upload


Elharter

Recommended Posts

Hallo liebe Freunde,

ich habe ein seltsames Phänomen das ich nicht eingrenzen kann.
Auf C# Seite ein einfaches Skript zum hochladen von Binärdateien:

 

 IEnumerator UploadFileCo(string uploadURL, string trackname)
    {
        //Debug.Log("uploadurl:"+uploadURL);
        //Debug.Log("trackname:"+trackname);

        //wait for 2 seconds to avoid error 429 to many requests on php side
        yield return StartCoroutine(Wait(6.0f));

        WWW localFile = new WWW(trackname);
        yield return localFile;
        WWWForm postForm = new WWWForm();
        postForm.AddBinaryData("file", localFile.bytes, trackname);
        WWW upload = new WWW(uploadURL, postForm);
        yield return upload;
        if (upload.error == null)
        {
            Debug.Log(upload.text);
            //Debug.Log("upload error null");
        }
        else
        {
            Debug.Log(upload.text);
            Debug.Log("Error during upload: " + upload.error +" at " + trackname + " and url was:" + uploadURL);
        }
    }

    IEnumerator Wait(float seconds)
    {
        yield return new WaitForSeconds(seconds);
    }

Auf der PHP Seite genauso einfach:

 

<?php
require_once ("mysqlconnect.php");   
$thefile = $_FILES['file'];  
if(!empty($thefile))  {
		$uploadfile =  '/blabla/tracks/' . $_FILES['file']['name'];
		
		
		$filename = $_FILES["file"]["name"];
		$filetype = $_FILES["file"]["type"];
		$filesize = $_FILES["file"]["size"];
		$tempfile = $_FILES["file"]["tmp_name"];
		
		//once all safety checks are done, you can safely move the file from the temporary location to a public accessible location
		move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile);
		
		$query = "insert into files values (DEFAULT,1,1, '$filename', '$filesize','123abc');"; 
		$result = mysql_query($query) or die('Query failed: ' . mysql_error()); 
		echo "ok"; 
								   
}  else  {
   echo "failed";  
}

?>

 

So....jetzt hol ich mir aus einem String-Array die Dateileiste und will ca. 55 Dateien hochladen.
Zu Beginn hat das anstandlos funktioniert.....umso länger ich gecoded habe umso stranger wurde das Verhalten.

Primäres Problem dabei ist:
 

Zitat

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE> 429 Too Many Requests</TITLE>
</HEAD><BODY>
<H1>Too Many Requests</H1>
The website is temporarily unable to service your request as it exceeded requests limit.
Please try again later.
</BODY></HTML>

UnityEngine.Debug:Log(Object)
<UploadFileCo>c__Iterator1:MoveNext() (at Assets/Scripts/LevelUploader.cs:95)
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)

Es tritt ständig verschieden auf.....manchmal gehen alle Files durch, manchmal kaum welche.

Bevor diese Meldungen auftraten, gingen die "größeren" Files nicht durch. Ich wollte es mit WaitforSeconds abfangen....aber das ändert irgendwie 0,0.

Was mache ich falsch?

 

danke

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 21.2.2019 um 13:59 schrieb Elharter:

IEnumerator Wait(float seconds) {
    yield return new WaitForSeconds(seconds);
}

Warum verwendest du diese Funktion, obwohl du gleich WaitForSeconds schreiben kannst? 
Also statt 

yield return StartCoroutine(Wait(6.0f)); // Außerdem sollte nicht einfach eine Wait(6.0f) klappen?
so
yield return new WaitForSeconds(6.0f);

Zweitens benutzt du eine veraltete Version der WWW / WWWPost (je nach unity version unterschiedlich). Schaue mal hier

Drittens (nur so am Rande), laut PHP Code ist deine PHP Version veraltet (oder man verwendet falsche Funktion). sowas wie mysql_query ist sehr alt und wird eigentlich gar nicht mehr verwendet, aber das sollte mit der eigentlichen Fehler nichts zu tun haben.

und nun Header. 429 Too Many Requests sagt, dass du zu viele Dinge hintereinander Requesten tust. Das muss jetzt nicht unbedingt an dir liegen, sondern kann an dem Server liegen. Vllt mag es nicht in 10 Minuten mehrere Requests bekommen. Darum gehen auch deine Files nur ab und zu durch. Der Server kann dich daher erst mal geblockt haben und dann geht das erst mal nicht für eine gewisse Zeit. Da muss man nach den Servereinstellungen (wahrscheinlich PHP Einstellungen) anschauen.

Versuchst du 55 Dateien auf einmal hochzuladen oder nacheinander?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe es umgeschrieben weil ich dachte dass es unter Umständen die Ursache für mein Problem ist und eine 2te Coroutine verwendet.

Ich habe es natürlich auch mit yield return new WaitForSeconds(6.0f); probiert.....hat sich in keinster Weise verändert.

 

Danke vorerst für deinen verlinkten Post, den werd ich mir ansehen!

@429 Fehler: Es verhält sich jedesmal anders. 1x lädt er alle Dateien hoch, beim 2ten Versuch nur die letzten 20.....beim 3ten Versuch macht er überhaupt nur 3.

Ich lese das Verzeichnis aus (dort liegen ca. 55 Files) und die lade ich der Reihe nach auf den Server hoch in einem zug (mit dem WaitForSeconds als Pause dazwischen).

lg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay....ich hab mich nun nochmal 3h hingesetzt und den Fehler gefunden.

Es war ein einfacher Logikfehler im Skript, sonst nichts. 
Ich habe in der Funktion die CoRoute (UploadFileCo) in einer Schleife in wenigen Millisekunden hunderte male aufgerufen.....das führte (natürlich) zu einem "429 too many requests" Fehler.

Habe die Schleife zum auslesen der Files nun in die UploadFileCo Iterator eingebaut und jetzt zieht auch das WaitforSeconds....und somit funktioniert es.

 

lg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...