Jak rozwiązać C: \ fakepath?

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

To jest mój przycisk przesyłania.

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

To pole tekstowe, w którym muszę pokazać pełną ścieżkę do pliku.

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

To jest JavaScript, który rozwiązuje mój problem. Ale w wartości alarmowej daje mi

C:\fakepath\test.csv 

a Mozilla daje mi:

test.csv

Ale chcę lokalną pełną ścieżkę pliku . Jak rozwiązać ten problem?

Jeśli wynika to z problemów związanych z bezpieczeństwem przeglądarki, jaki powinien być alternatywny sposób?

e_maxm
źródło
41
Jest to implementacja zabezpieczeń przeglądarki - przeglądarka chroni cię przed dostępem do struktury dysku. Pomocne może być wyjaśnienie, dlaczego chcesz uzyskać pełną ścieżkę.
Stuart,
1
Co rozumiesz przez pełny adres URL ? Adres przesłanego pliku?
gor
4
Dla przypomnienia, IE podaje bit „fakepath”, ponieważ nie chciał, aby serwery, które „spodziewały się” ścieżki do przebicia. W przeciwnym razie, podobnie jak inne przeglądarki ze względów bezpieczeństwa, otrzymasz tylko nazwę pliku (bez ścieżki). Co ważniejsze, chyba że masz złośliwe zamiary, nie rozumiem, dlaczego znajomość ścieżki zapewnia coś pożytecznego.
scunliffe
2
browser security issue~ jeśli jest zaimplementowany w przeglądarce (słusznie), to jest bardzo mało prawdopodobne, że można go obejść
Ross
13
O rany, trzymam wszystkie moje pliki C:\fakepath, więc teraz wszyscy znają moją strukturę katalogów.
mbomb007

Odpowiedzi:

173

Niektóre przeglądarki mają funkcję zabezpieczeń, która uniemożliwia JavaScriptowi rozpoznanie pełnej lokalnej ścieżki do pliku. Ma to sens - jako klient nie chcesz, aby serwer znał system plików komputera lokalnego. Byłoby miło, gdyby to zrobiły wszystkie przeglądarki.

Joe Enos
źródło
9
Jeśli przeglądarka nie wysyła lokalnej ścieżki do pliku, nie ma możliwości jej znalezienia.
Petteri Hietavirta
47
Wystarczy opublikować formularz: przeglądarka zajmie się przesyłaniem. Twoja strona internetowa nie musi znać pełnej ścieżki z powrotem na kliencie.
Rup
2
@ruffp Możesz przesłać tylko postem, więc musisz umieścić przesłany formularz i przesłać go. To nadal będzie używać standardowej kontroli przesyłania plików, aby wybrać plik i nadal nie będziesz potrzebować pełnej nazwy pliku klienta.
Rup
6
Wątpię, czy normalna witryna internetowa może zrobić coś złośliwego na komputerze lokalnym bez zaufanej wtyczki, takiej jak Flash lub Java. To bardziej kwestia prywatności. Na przykład, jeśli jesteś przesyłanie plików z pulpitu, byłbyś pozwalając serwer znać swoją nazwę użytkownika na komputerze lokalnym lub domeny ( c:\users\myname\desktoplub /Users/myname/Desktop/lub cokolwiek). To nie jest coś, o czym serwer sieciowy ma jakąkolwiek wiedzę biznesową.
Joe Enos
8
Prywatność prawie zawsze wiąże się z bezpieczeństwem i podatnością, ponieważ informacje mogą być wykorzystane przeciwko komuś. Ataki często wykorzystują wiele problemów, aby osiągnąć swoje cele. Każdy, kto nie rozpoznaje niebezpieczeństw, nie powinien mieć dostępu do kodu innego niż Hello World bez dodatkowych warsztatów paranoicznych.
Archimedix
70

Posługiwać się

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

zamiast

document.getElementById('file-id').value
Sardesh Sharma
źródło
16
W przeglądarce Chrome 44.0.2403.125 podana jest tylko nazwa pliku.
przerwa
4
Następnie użyj document.getElementById („identyfikator pliku”). Files [0] .path. Działa dobrze dla mnie.
Loaderon
Dzięki @Loaderon powinieneś opublikować to jako odpowiedź!
7geeky,
45

Używam obiektu FileReader na onchangezdarzeniu wejściowym dla twojego typu pliku wejściowego! W tym przykładzie użyto funkcji readAsDataURL iz tego powodu powinieneś mieć tag. Obiekt FileReader ma również readAsBinaryString, aby uzyskać dane binarne, które można później wykorzystać do utworzenia tego samego pliku na serwerze

Przykład:

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
źródło
jakiś pomysł, dlaczego nawet to nie działa na localhost? źródło jest ustawiane jako src = "C: \ fakepath \ filename.jpg", ale console.logging elementu obrazu mówi, że src to dataURL
galki
odpowiedź: rerendering sieci szkieletowej: /
galki
1
Nie masz pojęcia, ile frustracji zaoszczędził ten wpis. Z grubsza jest to diament ... tylko 12 głosów, ale zasługuje na znacznie więcej. Cieszę się, że spojrzałem w dół, ponieważ inne wpisy z dużo wyższymi ocenami nie działały, a także FormData () nie spełni naszych oczekiwań. Dobra robota!
user1585204
9
Pytanie dotyczy ścieżki pliku, a nie zawartości pliku.
Quentin
@Quentin: tak masz rację, ale jasne jest, że celem PO jest możliwość przesłania pliku na serwer. Dlatego to rozwiązanie zadziałałoby z pewnością bardzo pomocne dla wszystkich osób, które szukają sposobu przesyłania plików na serwer za pomocą JS.
user18490,
36

Jeśli przejdziesz do Internet Explorer, Narzędzia, Opcje internetowe, Zabezpieczenia, Niestandardowe, znajdź „Uwzględnij ścieżkę katalogu lokalnego podczas przesyłania plików na serwer” (jest to całkiem spory sposób) i kliknij „Włącz”. To zadziała

saikiran1043
źródło
2
Czy jest coś podobnego do Chrome?
Zaven Zareyan
11

Cieszę się, że przeglądarki chcą nas uratować przed natrętnymi skryptami i tym podobnymi. Nie jestem zadowolony z IE umieszczającego w przeglądarce coś, co sprawia, że ​​prosta poprawka stylu wygląda jak atak hakera!

Użyłem <span> do reprezentowania wejścia pliku, dzięki czemu mogłem zastosować odpowiednią stylizację do <div> zamiast <input> (jeszcze raz, z powodu IE). Teraz z powodu tego IE chce pokazać Użytkownikowi ścieżkę o wartości, która gwarantuje, że będzie się pilnować i będzie co najmniej pełna obaw (jeśli nie całkowicie ich odstraszy?!) ... WIĘCEJ IE-CRAP!

W każdym razie, dzięki tym, którzy opublikowali wyjaśnienie tutaj: Zabezpieczenia przeglądarki IE: Dodanie „fakepath” do ścieżki pliku na wejściu [type = „file”] , stworzyłem drobny program naprawczy ...

Poniższy kod ma dwie rzeczy - naprawia błąd lte IE8, w którym zdarzenie onChange nie jest uruchamiane do momentu przesłania onBlur pola przesyłania i aktualizuje element oczyszczoną ścieżką pliku, który nie odstraszy użytkownika.

// 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
źródło
Pamiętaj, że to nie działa w IE, dlatego; Zastąpiłem następujące: filePath.substring (filePath.lastIndexOf ('\\') + 1, filePath.length)
Bassel Kh
6

Natrafiłem na ten sam problem. W IE8 można to obejść, tworząc ukryte dane wejściowe po kontroli danych wejściowych pliku. Wypełnij to wartością poprzedniego rodzeństwa. W IE9 zostało to również naprawione.

Moim powodem, aby poznać pełną ścieżkę, było utworzenie podglądu obrazu javascript przed przesłaniem. Teraz muszę załadować plik, aby utworzyć podgląd wybranego obrazu.

Telefoontoestel
źródło
1
Jeśli ktoś chce zobaczyć obraz przed przesłaniem, może wyświetlić go na swoim komputerze.
mbomb007,
4

Jeśli naprawdę musisz przesłać pełną ścieżkę do pliku umieszczonego na górze, prawdopodobnie będziesz musiał użyć czegoś takiego jak podpisany aplet Java, ponieważ nie ma sposobu na uzyskanie tych informacji, jeśli przeglądarka ich nie wyśle.

jcoder
źródło
jak pełną ścieżkę oryginalną ścieżkę <input type = "file" accept = ". jpeg, .jpg, .png">. otrzymuję fałszywą ścieżkę, jak ją przywrócić
Govind Sharma
1

Użyj czytników plików:

$(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
źródło
-1

Hy tam, w moim przypadku używam środowiska programistycznego asp.net, więc chciałem przesłać te dane w żądaniu asynchronus ajax, w [webMethod] nie można złapać programu do przesyłania plików, ponieważ nie jest to element statyczny, więc musiałem zrób takie rozwiązanie, ustalając ścieżkę, niż przekonwertuj poszukiwany obraz na bajty, aby zapisać go w DB.

Oto moja funkcja javascript, mam nadzieję, że pomoże ci:

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;
             }
         }

tutaj tylko do testowania:

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

Uzupełnienie odpowiedzi Sardesh Sharma:

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

Aby uzyskać pełną ścieżkę.

Loaderon
źródło
To zwraca undefinedmi się w FireFox 75.0. Czy pathfaktycznie istnieje? Czy masz jakieś odniesienia do dokumentacji na ten temat?
Jose Manuel Abarca Rodríguez
1
Cześć! Opublikowałem tę odpowiedź po tym, jak sam próbowałem rozwiązać problem i udało mi się użyć ścieżki. Nie pamiętam, w jakim projekcie próbowałem tego, ale zawsze używam Google Chrome, być może to rozwiązanie jest odpowiednie tylko dla tej przeglądarki. A może nawet stało się przestarzałe z powodu aktualizacji przeglądarki. Przykro nam, że nie
mogę