Wie löse ich den C: \ fakepath auf?

256
<input type="file" id="file-id" name="file_name" onchange="theimage();">

Dies ist mein Upload-Button.

<input type="text" name="file_path" id="file-path">

Dies ist das Textfeld, in dem ich den vollständigen Pfad der Datei anzeigen muss.

function theimage(){
 var filename = document.getElementById('file-id').value;
 document.getElementById('file-path').value = filename;
 alert(filename);
}

Dies ist das JavaScript, das mein Problem löst. Aber in der Warnung gibt mir Wert

C:\fakepath\test.csv 

und Mozilla gibt mir:

test.csv

Aber ich möchte den lokalen vollqualifizierten Dateipfad . Wie kann ich dieses Problem beheben?

Wenn dies auf ein Sicherheitsproblem des Browsers zurückzuführen ist, wie sollte dies dann alternativ erfolgen?

e_maxm
quelle
41
Dies ist die Sicherheitsimplementierung des Browsers. Der Browser schützt Sie vor dem Zugriff auf Ihre Festplattenstruktur. Es kann hilfreich sein, wenn Sie erklären können, warum Sie den vollständigen Pfad möchten.
Stuart
1
Was meinst du mit vollständiger URL ? Adresse der hochgeladenen Datei?
Gor
4
Für den Datensatz gibt IE nur das Bit "fakepath" an, weil sie nicht wollten, dass Server, die einen Pfad "erwarteten", brechen. Ansonsten erhalten Sie wie bei anderen Browsern aus Sicherheitsgründen nur den Dateinamen (kein Pfad). Noch wichtiger ist, wenn Sie keine böswilligen Absichten haben, kann ich nicht verstehen, warum das Wissen um den Pfad etwas Nützliches bietet.
Scunliffe
2
browser security issue~ Wenn es im Browser implementiert ist (zu Recht), ist es höchst unwahrscheinlich, dass Sie es umgehen können
Ross
13
Meine Güte, verdammt, ich behalte alle meine Dateien in C:\fakepath, so dass jetzt jeder meine Verzeichnisstruktur kennt.
mbomb007

Antworten:

173

Einige Browser verfügen über eine Sicherheitsfunktion, die verhindert, dass JavaScript den lokalen vollständigen Pfad Ihrer Datei kennt. Es ist sinnvoll - als Client möchten Sie nicht, dass der Server das Dateisystem Ihres lokalen Computers kennt. Es wäre schön, wenn alle Browser dies tun würden.

Joe Enos
quelle
9
Wenn der Browser den lokalen Dateipfad nicht sendet, kann er nicht ermittelt werden.
Petteri Hietavirta
47
Senden Sie einfach das Formular: Der Browser kümmert sich um den Upload. Ihre Website muss nicht den vollständigen Pfad zurück auf dem Client kennen.
Rup
2
@ruffp Sie können nur mit einem Beitrag hochladen, daher müssen Sie den Upload in ein Formular einfügen und abschicken. Dabei wird weiterhin ein Standard-Steuerelement zum Hochladen von Dateien verwendet, um die Datei auszuwählen, und Sie benötigen weiterhin nicht den vollständigen Client-Dateinamen.
Rup
6
Ich bezweifle, dass eine normale Website Ihrem lokalen Computer etwas Böses antun kann, ohne ein vertrauenswürdiges Plugin wie Flash oder Java. Es ist eher eine Sache der Privatsphäre. Zum Beispiel , wenn Sie das Hochladen von Ihrem Desktop, dann würden Sie der Server wissen werden , lassen Sie Ihre Benutzername auf dem lokalen Rechner oder Domain ( c:\users\myname\desktopoder /Users/myname/Desktop/oder was auch immer). Das ist nichts, was ein Webserver geschäftlich weiß.
Joe Enos
8
Datenschutz bezieht sich fast immer auf Sicherheit und Verwundbarkeit, da Informationen gegen jemanden verwendet werden können. Angriffe nutzen häufig mehrere Probleme aus, um ihre Ziele zu erreichen. Wer die Gefahren nicht erkennt, sollte sich nicht in der Nähe von anderen Codes als Hello World ohne zusätzliche paranoide Workshops befinden.
Archimedix
70

Verwenden

document.getElementById("file-id").files[0].name; 

anstatt

document.getElementById('file-id').value
Sardesh Sharma
quelle
16
In Chrome 44.0.2403.125 erhalten Sie nur den Dateinamen.
Lücke
4
Verwenden Sie dann document.getElementById ("Datei-ID"). Files [0] .path. Funktioniert gut für mich.
Loaderon
Danke @Loaderon, du solltest dies als Antwort posten!
7geeky
45

Ich verwende das Objekt FileReader für das Eingabeereignis onchangefür Ihren Eingabedateityp! In diesem Beispiel wird die Funktion readAsDataURL verwendet. Aus diesem Grund sollten Sie ein Tag haben. Das FileReader-Objekt verfügt außerdem über readAsBinaryString, um die Binärdaten abzurufen, mit denen später dieselbe Datei auf Ihrem Server erstellt werden kann

Beispiel:

var input = document.getElementById("inputFile");
var fReader = new FileReader();
fReader.readAsDataURL(input.files[0]);
fReader.onloadend = function(event){
    var img = document.getElementById("yourImgTag");
    img.src = event.target.result;
}
Chakroun Yesser
quelle
Irgendeine Idee, warum auch dies bei localhost nicht funktioniert? Die Quelle wird als src = "C: \ fakepath \ filename.jpg" gesetzt, aber console.logging das Bildelement sagt, dass die src eine dataURL ist
galki
Antwort: Backbone Rerendering: /
Galki
1
Sie haben keine Ahnung, wie viel Frust dieser Eintrag gespart hat. Es ist ein Rohdiamant ... nur 12 Stimmen, aber viel mehr verdient. Ich bin froh, dass ich weiter nach unten geschaut habe, weil die anderen Einträge mit viel höheren Upvotes nicht funktionierten und auch FormData () für unsere Zwecke nicht ausreicht. Gut gemacht!
user1585204
9
Die Frage fragt nach dem Dateipfad nicht der Inhalt der Datei.
Quentin
@ Quentin: Ja, Sie haben Recht, aber klar ist die Absicht des OP, die Datei irgendwie auf den Server hochladen zu können. Daher ist diese Lösung sicherlich sehr hilfreich für alle Personen, die nach einer Möglichkeit suchen, Dateien mit JS auf einen Server hochzuladen.
user18490
36

Wenn Sie zu Internet Explorer, Extras, Internetoption, Sicherheit, Benutzerdefiniert wechseln, suchen Sie den Pfad "Lokales Verzeichnis beim Hochladen von Dateien auf einen Server einschließen" (dies ist ziemlich weit unten) und klicken Sie auf "Aktivieren". Das wird funktionieren

saikiran1043
quelle
2
Gibt es etwas ähnliches wie Chrome?
Zaven Zareyan
11

Ich bin froh, dass Browser uns vor aufdringlichen Skripten und Ähnlichem bewahren möchten. Ich bin nicht zufrieden damit, dass der IE etwas in den Browser einfügt, das eine einfache Stilkorrektur wie einen Hack-Angriff aussehen lässt!

Ich habe eine <span> verwendet, um die Dateieingabe darzustellen, damit ich anstelle der <Eingabe> (erneut aufgrund des IE) ein geeignetes Styling auf die <div> anwenden kann. Aus diesem Grund möchte der IE dem Benutzer einen Pfad mit einem Wert zeigen, der ihn garantiert auf der Hut hält und im geringsten besorgt ist (wenn nicht sogar völlig abschreckt ?!) ... MEHR IE-CRAP!

Trotzdem habe ich dank derer, die die Erklärung hier gepostet haben: IE-Browsersicherheit: Anhängen von "fakepath" an den Dateipfad in input [type = "file"] , ein kleines Fixer-Upper zusammengestellt ...

Der folgende Code bewirkt zwei Dinge: Er behebt einen IE8-Fehler, bei dem das onChange-Ereignis erst ausgelöst wird, wenn das Upload-Feld onBlur ist, und aktualisiert ein Element mit einem bereinigten Dateipfad, der den Benutzer nicht erschreckt.

// self-calling lambda to for jQuery shorthand "$" namespace
(function($){
    // document onReady wrapper
    $().ready(function(){
        // check for the nefarious IE
        if($.browser.msie) {
            // capture the file input fields
            var fileInput = $('input[type="file"]');
            // add presentational <span> tags "underneath" all file input fields for styling
            fileInput.after(
                $(document.createElement('span')).addClass('file-underlay')
            );
            // bind onClick to get the file-path and update the style <div>
            fileInput.click(function(){
                // need to capture $(this) because setTimeout() is on the
                // Window keyword 'this' changes context in it
                var fileContext = $(this);
                // capture the timer as well as set setTimeout()
                // we use setTimeout() because IE pauses timers when a file dialog opens
                // in this manner we give ourselves a "pseudo-onChange" handler
                var ieBugTimeout = setTimeout(function(){
                    // set vars
                    var filePath     = fileContext.val(),
                        fileUnderlay = fileContext.siblings('.file-underlay');
                    // check for IE's lovely security speil
                    if(filePath.match(/fakepath/)) {
                        // update the file-path text using case-insensitive regex
                        filePath = filePath.replace(/C:\\fakepath\\/i, '');
                    }
                    // update the text in the file-underlay <span>
                    fileUnderlay.text(filePath);
                    // clear the timer var
                    clearTimeout(ieBugTimeout);
                }, 10);
            });
        }
    });
})(jQuery);
Anand Sharma
quelle
Bitte beachten Sie, dass dies im IE nicht funktioniert. Ich habe Folgendes ersetzt: filePath.substring (filePath.lastIndexOf ('\\') + 1, filePath.length)
Bassel Kh
6

Ich bin auf das gleiche Problem gestoßen. In IE8 könnte dies umgangen werden, indem nach dem Dateieingabesteuerelement eine versteckte Eingabe erstellt wird. Füllen Sie dies mit dem Wert des vorherigen Geschwisters. In IE9 wurde dies ebenfalls behoben.

Mein Grund, um den vollständigen Pfad kennenzulernen, war, vor dem Hochladen eine Javascript-Bildvorschau zu erstellen. Jetzt muss ich die Datei hochladen, um eine Vorschau des ausgewählten Bildes zu erstellen.

Telefoontoestel
quelle
1
Wenn jemand ein Bild vor dem Hochladen sehen möchte, kann er es auf seinem Computer anzeigen.
mbomb007
4

Wenn Sie wirklich den vollständigen Pfad der hochgeladenen Datei senden müssen, müssen Sie wahrscheinlich so etwas wie ein signiertes Java-Applet verwenden, da es keine Möglichkeit gibt, diese Informationen abzurufen, wenn der Browser sie nicht sendet.

jcoder
quelle
Wie man den ursprünglichen Pfad vollständig einfindet <input type = "file" accept = ". jpeg, .jpg, .png">. Ich bekomme einen falschen Pfad, wie man ihn wieder entfernt
Govind Sharma
1

Verwenden Sie Dateireader:

$(document).ready(function() {
        $("#input-file").change(function() {
            var length = this.files.length;
            if (!length) {
                return false;
            }
            useImage(this);
        });
    });

    // Creating the function
    function useImage(img) {
        var file = img.files[0];
        var imagefile = file.type;
        var match = ["image/jpeg", "image/png", "image/jpg"];
        if (!((imagefile == match[0]) || (imagefile == match[1]) || (imagefile == match[2]))) {
            alert("Invalid File Extension");
        } else {
            var reader = new FileReader();
            reader.onload = imageIsLoaded;
            reader.readAsDataURL(img.files[0]);
        }

        function imageIsLoaded(e) {
            $('div.withBckImage').css({ 'background-image': "url(" + e.target.result + ")" });

        }
    }
Marcos Di Paolo
quelle
-1

Hy dort, in meinem Fall verwende ich asp.net Entwicklungsumgebung, also wollte ich diese Daten in asynchronus ajax Anfrage hochladen, in [webMethod] können Sie den Datei-Uploader nicht abfangen, da es kein statisches Element ist, also musste ich Machen Sie einen Umsatz für eine solche Lösung, indem Sie den Pfad festlegen, und konvertieren Sie dann das gewünschte Bild in Bytes, um es in der Datenbank zu speichern.

Hier ist meine Javascript-Funktion, hoffe es hilft dir:

function FixPath(Path)
         {
             var HiddenPath = Path.toString();
             alert(HiddenPath.indexOf("FakePath"));

             if (HiddenPath.indexOf("FakePath") > 1)
             {
                 var UnwantedLength = HiddenPath.indexOf("FakePath") + 7;
                 MainStringLength = HiddenPath.length - UnwantedLength;
                 var thisArray =[];
                 var i = 0;
                 var FinalString= "";
                 while (i < MainStringLength)
                 {
                     thisArray[i] = HiddenPath[UnwantedLength + i + 1];
                     i++;
                 }
                 var j = 0;
                 while (j < MainStringLength-1)
                 {
                     if (thisArray[j] != ",")
                     {
                         FinalString += thisArray[j];
                     }
                     j++;
                 }
                 FinalString = "~" + FinalString;
                 alert(FinalString);
                 return FinalString;
             }
             else
             {
                 return HiddenPath;
             }
         }

hier nur zum testen:

 $(document).ready(function () {
             FixPath("hakounaMatata:/7ekmaTa3mahaLaziz/FakePath/EnsaLmadiLiYghiz");
         });
// this will give you : ~/EnsaLmadiLiYghiz
Shiva Brahma
quelle
-3

Ergänzend zu Sardesh Sharmas Antwort:

document.getElementById("file-id").files[0].path

Für vollen Weg.

Loaderon
quelle
Dies kehrt undefinedin FireFox 75.0 zu mir zurück. Existiert patheigentlich? Haben Sie einen Hinweis auf die Dokumentation dazu?
Jose Manuel Abarca Rodríguez
1
Hallo! Ich habe diese Antwort gepostet, nachdem ich versucht hatte, das Problem selbst zu lösen und den Pfad erfolgreich zu verwenden. Ich erinnere mich nicht, in welchem ​​Projekt ich dies versucht habe, aber ich verwende immer Google Chrome. Vielleicht ist diese Lösung nur für diesen Browser geeignet. Und es könnte sogar aufgrund von Browser-Updates veraltet sein. Tut mir leid, dass ich nicht weiter helfen kann: /
Loaderon