ebody: JQuery get() und PHP mime_content_type() - Prüfung ohne Upload der Datei auf Server möglich?

Hallo,

mit JQuery get() möchte ich die Datei aus <input type="file"> an ein PHP Script senden, welches den Mime Type der Datei mit mime_content_type() prüfen soll.

Ist das nur möglich, wenn die Datei auf den Server hochgeladen/kopiert wird?

$.get( 'php/script.php', { varFile:''+this.files[0]+''}, function( data ) {...

data gibt in der Console aus: "Data Loaded: <br /> <b>Warning</b>: mime_content_type([object File]): failed to open stream: No such file or directory in..."

Ich würde es gerne vermeiden, dass Dateien auf dem Server hochgeladen werden müssen, u.a. wegen dem Traffic und aus Sicherheitsgründen. Es darf sich nur um eine Bilddatei jpg, gif, png, svg handeln.

Gruß ebody

  1. Es kann sein, dass

    <html>
    <body>
    <h1>Geht das?</h1>
    <script src="./jquery.min.js"></script>
    <script>
    $.get( "./test.txt", function( data ) {
      alert( data );
    });
    </script>
    </body>
    </html>
    

    mit sehr merkwürdigen und unsicheren Browsern funktioniert. Aber es wird wohl eher nicht so sein. Denn selbst wenn ich das HTML-Dokument mit der URL 'file:///tmp/test.txt' öffne, bekomme ich folgende Fehlermeldung:

    Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at file:///tmp/test.txt. (Reason: CORS request not http).

    (Und das ist auch gut so!)

    1. (Und das ist auch gut so!)

      Bedenke, was los wäre, wenn per Javascript lesend auf das Dateisystem zugegriffen werden könnte. Da könnte jeder Webserverbetreiber einfach mal Deine Datei 'Konten_und_Passwoerter.txt' lesen, und sich mit dem nächsten Ajax-Request bequem und sicher nach Hause schicken lassen. Da bekämst Du - jedenfalls so lange Dein Dispo nicht ganz ausgereizt ist, ganz schnell einen Premium-Zugang zu allen Hamster-Seiten.

      1. Par-Dong!

        wenn ich das HTML-Dokument mit der URL 'file:///tmp/test.txt' öffne,
        

        (in /tmp/test.txt steht nur "Hallo Welt!")

        wenn ich das HTML-Dokument mit der URL 'file:///tmp/test.html' öffne,
        
    2. Hallo Raketenwissenschaftler,

      ich habe nicht verstanden, was deine Antwort mit der Frage zu tun hat. Wenn die HTML Seite über file: geladen ist, sind Ajax-Requeste auf die gleiche Quelle nicht möglich, sie werden immer als Cross Origin betrachtet. file: Requests einer via http: geladenen Seite sind sowieso Cross Origin und werden abgewiesen.

      Es hat aber niemand behauptet, dass ebody seine Seite über file: geladen hat oder aus einer http: Seite auf file: zugreifen will.

      Oder übersehen ich etwas? Abgesehen davon möchte er etwas senden (oder vermeiden zu senden), nicht empfangen. Er hat nur den Fehler gemacht, das mit $.get zu probieren...

      Rolf

      --
      sumpsi - posui - clusi
        1. Hallo Raketenwissenschaftler,

          ja ok, ändert aber nichts daran dass da Nachladen von der gleichen Quelle (also Ajax Calls auf ./foo.txt) grundsätzlich nicht möglich ist, wenn die Quelle file:/// ist.

          Und es ändert auch nichts an dem Umstand, dass das ein PAL[1] ist. Ebody möchte eine Datei an ein PHP Script schicken, d.h. da ist ein Webserver davor, d.h. http(s) Protokoll, und er möchte eigentlich vermeiden, falsche MIME-Typen hochzuladen.

          Rolf

          --
          sumpsi - posui - clusi

          1. Problem Anderer Leute ↩︎

  2. Hallo ebody,

    wenn Du möchtest, dass der Browser den Mime-Typ überprüft, verwende das accept-Attribut des <input type="file">. Eine weitergehende Prüfung in JavaScript ist dann nicht nötig, hoffe ich...

    Auf dem Server musst Du ohnehin gegen böswillige Sendungen prüfen, aber dafür musst Du $.post und nicht $.get verwenden.

    Als data-Parameter musst Du ein FormData-Objekt verwenden. Dem musst Du im Konstruktor das Form übergeben, in dem das Upload-Element steht, das ist am einfachsten. Wie man das file Element dem FormData manuell beibiegt, weiß ich grad nicht, dafür müsste ich erstmal experimentieren.

    Rolf

    --
    sumpsi - posui - clusi
  3. Hallo,

    Ich würde es gerne vermeiden, dass Dateien auf dem Server hochgeladen werden müssen, u.a. wegen dem Traffic und aus Sicherheitsgründen. Es darf sich nur um eine Bilddatei jpg, gif, png, svg handeln.

    ich vermute, hinter get verbirgt sich ein XMLHttpRequest. Inzwischen verbieten das alle Browser bei Zugriff auf die lokale Festplatte.

    Im Firefox kannst du den Zugriff erlauben mit

    about:config öffnen security.fileuri.strict_origin_policy auf false setzen

    Ich würde aber für den Zugriff auf die lokale Festplatte die FileReader-API verwenden.

    Gruß
    Jürgen

    1. Hallo,

      Im Firefox kannst du den Zugriff erlauben mit

      about:config öffnen security.fileuri.strict_origin_policy auf false setzen

      Bei Chrome bzw. Chromium-basierten Browsern wie Opera und Iron alternativ an der Programmverknüpfung ergänzen:

      --allow-file-access-from-files

      Grüße,
      Thomas

  4. Also 1. der Content-Type: Den kriegst Du indem Du die FileAPI auf das <form><input>-Element anwendest.

    Und 2. das Upload funktioniert nur per method="POST" und Enctype="multipart/form-data" im Form-Element.

    Wie das mit JS geht, siehe da

    MFG

    1. Also 1. der Content-Type: Den kriegst Du indem Du die FileAPI auf das <form><input>-Element anwendest.

      Und 2. das Upload funktioniert nur per method="POST" und Enctype="multipart/form-data" im Form-Element.

      Wie das mit JS geht, siehe da

      Als Ergänzung: Wie die Anwendung zeigt, liefern FileAPI und FormData ggf. unterschiedliche Ergebnisse, was den Content-Type der angehängten Dateien angeht. Auf jeden Fall muss der Content-Type auch serverseitig geprüft werden, bevor die Dateien da weiterverwendet werden.

      MFG