HTML Javascript - Upload-Script - Fehler im Code?

Sithys

Captain Pro
Registriert
Dez. 2010
Beiträge
3.466
Hallo und guten Morgen zusammen,
ich programmiere gerade eine App für iOS die es ermöglichen soll, ein aus der Galerie ausgewähltes Bild an meinen Server zu senden. Nun, man muss sich hierfür nicht direkt mit Objective-C auskennen, sondern mit HTML/CSS/JavaScript/PHP. Alles (noch) nicht meine Kerngebiete, weshalb ich derzeit leicht verzweifel :freak: .

Fakt ist, ich habe ein Javascript, welches wie folgt aussieht:

Code:
        <script type="text/javascript" charset="utf-8">
            
            // Wait for device API libraries to load
            //
            document.addEventListener("deviceready", onDeviceReady, false);
            
            // device APIs are available
            //
            function onDeviceReady() {
                // Retrieve image file location from specified source
                navigator.camera.getPicture(
                                            uploadPhoto,
                                            function(message) { alert('get picture failed'); },
                                            {
                                            quality         : 50,
                                            destinationType : navigator.camera.DestinationType.FILE_URI,
                                            sourceType      : navigator.camera.PictureSourceType.PHOTOLIBRARY
                                            }
                                            );
            }
        
        function uploadPhoto(imageURI) {
            var options = new FileUploadOptions();
            options.fileKey="file";
            options.fileName=imageURI.substr(imageURI.lastIndexOf('/')+1);
            options.mimeType="image/jpeg";
            alert("nc");
            var params = {};
            params.value1 = "test";
            params.value2 = "param";
            
            options.params = params;
            alert("hier gehts also auch noch");
            var ft = new FileTransfer();
            ft.upload(imageURI, encodeURI("http://mein-server.de/upload.php"), win, fail, options, true);
        }
        
        function win(r) {
            console.log("Code = " + r.responseCode);
            console.log("Response = " + r.response);
            console.log("Sent = " + r.bytesSent);
            alert("ZACK - VERSCHISSEN DU DEPP");
        }
        
        function fail(error) {
            alert("An error has occurred: Code = " + error.code);
            console.log("upload error source " + error.source);
            console.log("upload error target " + error.target);
        }
        
            </script>
Die App startet also ganz normal auf meinem Gerät, und es öffnet sich sofort die Galerie. Hier wähle ich ein Bild aus. Anschließend erhalte ich die Meldungen
und
hier geht es also auch noch
Nach 2-3 Sekunden kommt dann
ZACK - VERSCHISSEN DU DEPP
Die alerts habe ich selber eingebaut. Ich erhalte also die Meldung aus der Funktion win, welche ja eig. so viel bedeutet wie "Hey, hat geklappt". Aus einem anderen Beispiel habe ich den Code kopiert, dort stand statt meines ausgewählten Spruchs "Code Slayer!!!", was ja eig. auch so viel heißt wie "Verschissen"... warum wird mir in der win Funktion ein "Verkackt" ausgegeben?

Auf meinem Server liegt die upload.php, welche folgenden Code beinhaltet ->
PHP:
<?php
   print_r($_FILES);
   $new_image_name = "YEAH.jpg";
   move_uploaded_file($_FILES["file"]["tmp_name"], "/var/www/vhosts/mein-server.de/httpdocs/images/".$new_image_name);
?>

Das Bild kommt nicht auf dem Server an und ich bin ratlos, woran das liegen könnte. ._.

Hoffe von Euch hat jemand eine Idee!
Vielen Dank im voraus!

/Edit: in der XCode Console steht im Übrigen:
2014-06-24 09:13:58.246 upload[4675:610b] File Transfer Finished with response code 200

Bevor jemand tatsächlich nachfragt, natürlich steht bei mein-server.de mein Server drin ;) !
 
Zuletzt bearbeitet:
Bin gerade auch dabei mich in diese Thematik einzuarbeiten, daher bitte ich um Nachsicht, falls ich Unsinn schreibe. :D
Hast du mal geprüft ob es vielleicht einen Fehler auf Serverseite gibt? Vielleicht gibts dort ein Problem mit Zugriffsrechten oder sowas in der Richtung? Ich würde dort mal ein paar Ausgaben mit einbauen.
 
Also ich hab testhalber mal phpinfo ausgeben lassen. Das sieht aber alles super aus, max_file_size sind 128MB, file_upload ist on,... die phpinfo hab ich mir gestern 1 Stunde zu Gemüte geführt. Auch, wenn ich den Server als direkte Ursache nicht ausschließe - ich wüsste nicht, wo ich dort was genau konfigurieren müsste, damit er meine bescheuerten Bilder annimmt :p
 
Ich könnte es nicht 100% sagen, aber ich würde mal sagen xCode simuliert das ganze nur und es findet keine Datenübertragung statt. Das könnte auch erklären warum die Win Funktion den Fehler ausgibt.
 
Hey Cool Master und danke für das Feedback.

Das mit der Simulation kann ich aber ausschließen, ich installiere die App direkt auf meinem Device, ziehe es ab und versuche es dann über die vorhandene W-Lan Verbindung, was auch nicht funktioniert. Die XCode Console schaue ich mir dann zwischendurch immer mal wieder an. I.d.R. ziehe ich das iPhone aber dann immer ab.
 
Das ist einfach ein Übersetzungsfehler. Die Funktion "win" ist tatsächlich die Funktion, die bei ERFOLGREICHER Übertragung ausgeführt wird. Der "Code Slayer" ist also jemand, der sich erfolgreich durch den Code-Dschungel gehackt hat.

Auf dem Server wird nix passieren, weil du im Zweifel die Daten falsch abgreifst. Evtl. landet dein Kram nicht im $_FILES - Array sondern versumpft irgendwo im $_POST.
Der beste Tip ist: Bau dir ne kleine Funktion in PHP, die den Inhalt der beiden Arrays in eine Textdatei loggt, z.B. indem du die Arrays vorher serialisierst. Da kannst du nach der Übertragung gucken, was denn eigentlich im Request stand. Auch $_GET solltest du mal in den Text loggen.
 
Daaron, da bekommt der Code Slayer doch tatsächlich eine ganz andere Bedeutung :-P!

Das mit dem auslesen des Array Inhaltes ist wirklich ein super Tipp, das werde ich gleich mal eben basteln und mich dann melden - danke dafür!
 
Hi,

Also ich hab testhalber mal phpinfo ausgeben lassen

Und das bringt was genau? Lass dir doch einfach von deiner Methode "move_uploaded_file" mal alle Fehler ausgeben bzw. logge mit, ob du überhaupt dahin kommst. Passiert überhaupt etwas, also wird die PHP Datei überhaupt korrekt angesteuert?

Die "win" Funktion ist in meinen Augen schon die korrekte Funktion, was du da ausgibst bleibt ja dir überlassen. Ich denke da sollte eigentlich "Erfolg" oder sowas stehen.

VG,
Mad
 
... also die Antwort der php datei ->

FILES und REQUEST... beides Leer.

Also, das Hauptscript kommt von hier: http://stackoverflow.com/questions/...phonegaps-file-transfer-api/13992423#13992423

ich habe jetzt noch mal alles auf 0 gebracht und mir fällt auf, dass der alert "Code Slayer" viel zu früh kommt. So schnell kann der ein File gar nicht uploaden. Kurz nachdem es ausgewählt ist, ploppt der Code auf. Als würde es diese Verbindung zur Upload.php gar nicht geben.


Neuer Fehler, neues Glück:
2014-06-24 10:06:29.781 upload[4807:1803] FileTransferError {
body = "";
code = 3;
"http_status" = 500;
source = "file:///var/mobile/Applications/334FB4D1-8AC7-46BB-AF3E-6704D1FD5762/tmp/cdv_photo_002.jpg";
target = "http://mein-server.de/upload.php";
}

...wie ich gerade festgestellt habe, nutzt unser Server nginx... dafür muss man aber erst ein Plugin installieren um den ChunkedMode zu aktivieren. Das werde ich jetzt mal tun.

____________________________________________________________

/Edit - 11:12Uhr -> Also, erstmal folgt jetzt ein Update von Ubuntu 12.04 auf 14.04. Anschließend ein Plesk Update von 11.05 auf 12. Wenn das alles vollzogen ist, sollte nginx automatisch mit chunkin-mode laufen (dieser ist mittlerweile in nginx integriert und kein Plugin mehr (
This module is no longer needed for Nginx 1.3.9+ because since 1.3.9, the Nginx core already has built-in support for the chunked request bodies.

And this module is now only maintained for Nginx versions older than 1.3.9.
)
 
Zuletzt bearbeitet:
warum entwickelst du nicht gegen irgend ne billige VM, in der du n aller-einfachsten LAMP-Stack laufen lässt, ohne Plesk und sonstwelchen Ramsch?
 
Könnte ich auch tun, allerdings muss die App später mit dem Server kommunizieren können. Deswegen mache ich mich gleich daran, das Serverproblem zu eliminieren.

Neues Upload-Script ->

PHP:
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);

var_dump ($_FILES);

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 900000)
&& in_array($extension, $allowedExts)) {
  if ($_FILES["file"]["error"] > 0) {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
  } else {
    echo "Upload: " . $_FILES["file"]["name"] . "<br>";
    echo "Type: " . $_FILES["file"]["type"] . "<br>";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";
    if (file_exists("images/" . $_FILES["file"]["name"])) {
      echo $_FILES["file"]["name"] . " already exists. ";
    } else {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "images/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "images/" . $_FILES["file"]["name"];
    }
  }
} else {
  echo "Invalid file";
}

Was kommt raus? Richtig: Invalid File X)
 
Zuletzt bearbeitet:
Traue nie dem Wert in ["type"], der hängt einzig davon ab, was der Client so übermittelt.... und Clients sind berühmt dafür, mutwillig oder fahrlässig totalen Mumpitz zu versenden.
 
Läuft btw... was wars? Der Server... ich wollte nachher noch mal die phpinfo vergleichen, aber jetzt geht es auf jeden fall!
 
Ich sag ja, zum Entwickeln geht nix über einen vollkommen StiNo konfigurierten LAMP-Stack. Wenn da alles geht, auf der Live-Umgebung aber nicht, dann liegts am Live-Server. So schließt du in der Entwicklungsphase schon mal die Server-Variable aus.
 
Da hast du sicher recht Daaron! Allerdings bin ich noch relativ frisch in diesem Bereich und eigne mir gerade erst nach und nach die benötigten Kentnisse an.

Ich habe mir zu deinen angesprochenen Dingen (LAMP etc.) aber schon ein paar Links abgespeichert die ich mir heute Abend zu Gemüte führe! ;)

Danke!
 
brauchst eigentlich nix für. Nimm dir ne Debian- oder Ubuntu-Minimal-ISO und folg dem Mini-Installer. Irgendwann landest du im "tasksel", wo du sagst, was die Kiste können soll. Da setzte Häkchen beim LAMP-Stack, schaltest noch so Krams wie SSH und FTP an und drückst Ja & Amen. Schon hast du einen (nicht fürs Internet "gehärteten") lauffähigen Apache, der sich nur in einigen Sicherheits- und Performance-Aspekten von nem "echten" Server unterscheidet.
 

Ähnliche Themen

Antworten
22
Aufrufe
2.927
mambokurt
M
M
Antworten
1
Aufrufe
1.032
master.rv
M
Antworten
1
Aufrufe
1.536
Zurück
Oben