Dlaczego nie mogę zrobić <img src = “C: /localfile.jpg”>?


101

Działa, jeśli plik html jest lokalny (na moim dysku C), ale nie, jeśli plik html znajduje się na serwerze, a plik obrazu jest lokalny. Dlaczego?

Jakieś możliwe obejścia?


3
Czy mogę zapytać, dlaczego chciałbyś to zrobić?
Boris Callens

2
@BorisCallens Na przykład mógłbym chcieć przetestować zmianę obrazu na mojej stronie testowej, kiedy mam nowy obraz na własnym komputerze i nie chcę przechodzić przez cały proces wgrywania do inscenizacji. Wydaje się, że jedynym sposobem na to byłaby zmiana obrazu w środowisku programistycznym zamiast i tak postoju.
xji

Jest to również świetny sposób na zażartowanie ze swoich mniej kompetentnych technicznie znajomych, sprawiając, że myślą, że włamałeś się na stronę internetową.
0112

Innym sposobem na zrobienie tego szybko jest przesłanie pliku, aby powiedzieć, dysk Google lub cokolwiek innego, a następnie skopiuj adres URL obrazu i wklej go do środkasrc=""
0112

Po prostu użyj programistycznego serwera WWW na swoim komputerze. W dzisiejszych czasach jest to łatwe, ponieważ nawet PHP jest wyposażone w jedno wbudowane.
MauganRa

Odpowiedzi:


66

Byłaby to luka w zabezpieczeniach, gdyby klient mógł zażądać plików lokalnego systemu plików, a następnie użyć JavaScript, aby dowiedzieć się, co się w nich znajduje.

Jedynym sposobem obejścia tego jest utworzenie rozszerzenia w przeglądarce. Rozszerzenia przeglądarki Firefox i rozszerzenia IE mogą uzyskiwać dostęp do zasobów lokalnych. Chrome jest znacznie bardziej restrykcyjny.


1
nadal jednak flashowi udaje się uzyskać dostęp do wszystkiego, co wybierze użytkownik, nawet w przeglądarce Chrome
Javier

1
Głosował za tym, ponieważ odpowiedział na pytanie dlaczego i dał kilka sposobów na obejście tego. Najprawdopodobniej (i wiem, że nie przedstawiłem zbyt wielu informacji), to utworzenie lokalnego serwera WWW do obsługi lokalnych obrazów. W ten sposób przeglądarka może je wyświetlić.
PeterV

1
Flash może uzyskać dostęp do lokalnych zasobów tylko wtedy, gdy plik zasad jest na miejscu lub w inny sposób przechodzi do trybu lokalnego i jest ograniczony w inny sposób.
Bjorn

2
Ta paranoiczna ochrona jest tylko zakłóceniem. Możesz przesłać pliki użytkownika na serwer za pomocą AJAX-a z formularza z polem <input type = file>, ale jeśli chcesz być miły dla użytkownika i pokazać podgląd, MUSISZ zrobić podróż w obie strony i przesłać plik do najpierw serwer. Czy jest to bezpieczniejsze niż lokalne generowanie obrazu podglądu?
MKaama,

2
Aby pokazać użytkownikowi ładny podgląd, MUSISZ WYKONAĆ OKRĄGŁĄ PODRÓŻ NA SERWER. Jest to możliwe dzięki AJAX. W jaki sposób przesłanie pliku na serwer jest najpierw bezpieczniejsze niż lokalne wygenerowanie obrazu podglądu? Paranoiczne zabezpieczenie stwarza jedynie zakłócenia, ale nie rozwiązuje żadnego problemu.
MKaama,

32

czy nie należy używać „file: // C: /localfile.jpg” zamiast „C: /localfile.jpg”?


Tak, ale ta sztuczka zadziała tylko w systemach Windows. W systemie Linux musisz utworzyć łącze symboliczne do zasobu, umieścić łącze na tej samej stronie internetowej i wywołać je za pomocą src = "...". Innymi słowy, o ile próbowałem, przedrostek „file: //” nie będzie działał w systemach Linux, ale będzie działał doskonale w systemach Windows.
Energetyka

28

Przeglądarki nie mogą uzyskać dostępu do lokalnego systemu plików, chyba że uzyskujesz dostęp do lokalnej strony HTML. Musisz gdzieś przesłać obraz. Jeśli znajduje się w tym samym katalogu co plik html, możesz użyć<img src="localfile.jpg"/>


Próbowałem osiągnąć to samo, używając ścieżki bezwzględnej „/localfile.jpg”, ale wygląda na to, że przeglądarka traktuje to jak „obraz sieciowy” i go nie znajduje. Dzięki!
jmojico


6

Szczerze mówiąc, najłatwiejszym sposobem było dodanie hostingu plików do serwera.

  • Otwórz IIS

  • Dodaj katalog wirtualny w domyślnej witrynie sieci Web

    • wirtualna ścieżka będzie tym, do czego chcesz przeglądać w przeglądarce. Więc jeśli wybierzesz " nazwa_serwera / obrazy , będziesz mógł do niego przeglądać, przechodząc do http: // nazwa_serwera / images
    • Następnie dodaj ścieżkę fizyczną na dysku C :.
  • Dodaj odpowiednie uprawnienia do folderu na dysku C: dla „NETWORK SERVICE” i „IIS AppPool \ DefaultAppPool”

  • Odśwież domyślną witrynę sieci Web

  • I jesteś skończony. Możesz teraz przejść do dowolnego obrazu w tym folderze, przechodząc do http: //yourServerName/cokolwiekYourFolderNameIs/yourImage.jpg i użyć tego adresu URL w swoim img src

Mam nadzieję, że to komuś pomoże


3

IE 9: Jeśli chcesz, aby użytkownik obejrzał obraz przed wysłaniem go na serwer: Użytkownik powinien DODAĆ witrynę do „listy zaufanych witryn internetowych”.


3

możemy użyć funkcji FileReader () javascript i jego funkcji readAsDataURL (fileContent), aby wyświetlić plik lokalnego dysku / folderu. Powiąż zdarzenie zmiany z obrazem, a następnie wywołaj funkcję showpreview języka JavaScript. Spróbuj tego -

<!doctype html>
<html>

<head>
    <meta charset='utf-8'>
    <meta name='viewport' content='width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no;'>
    <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
    <title></title>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

    <script type="text/javascript">
    function showpreview(e) {
        var reader = new FileReader();
        reader.onload = function (e) {
            $("#previewImage").attr("src", e.target.result);
        }
        //Imagepath.files[0] is blob type
        reader.readAsDataURL(e.files[0]);
    }
    </script>
</head>
<body >
    <div>
    <input type="file" name="fileupload" value="fileupload" id="fileupload" onchange='showpreview(this)'>
    </div>
    <div>
        &nbsp;
    </div>
    <div>
    <img width="50%" id="previewImage">
    </div>
</body>
</html>

Chrome zgłasza błąd w konsoli „Niedozwolone jest ładowanie zasobu lokalnego”.
raosaeedali

1
@raosaeedali Przepraszamy za spóźnioną odpowiedź. Jeśli chcemy wyświetlać obrazy z dysku lokalnego bezpośrednio w naszym tagu img na stronie HTML, musimy podać ścieżkę względną. Innym rozwiązaniem jest pobranie ścieżki pliku z pliku typu wejściowego i przypisanie źródła pliku do znacznika img, w tym celu zaktualizowałem kod.
Ravindra Vairagi

@RavindraVairagi czy istnieje sposób na wyświetlenie obrazu bez wybierania pliku w eksploratorze? Próbowałem użyć twojego skryptu i nie otrzymałem błędu „Nie można załadować lokalnego zasobu”, ale chcę znaleźć sposób na bezpośrednie wydrukowanie obrazu, jeśli istnieje ...
Bandoleras

2

Pomijając obserwację Newtanga dotyczącą zasad bezpieczeństwa, skąd masz wiedzieć, że każdy, kto przegląda twoją stronę, będzie miał prawidłowe obrazy c:\localfile.jpg? Nie możesz. Nawet jeśli myślisz, że możesz, nie możesz. Po pierwsze, zakłada środowisko Windows.


Chyba że możesz. Nie podałem zbyt wiele kontekstu w pytaniu, wiem :) Ale w tym przypadku możemy faktycznie wiedzieć.
PeterV

5
Co jeśli planuje mieć tylko 10 użytkowników w biurze, z których wszyscy mają środowiska Windows i poprawne obrazy w c: \ localfile.jpg. W tym celu ... byłby w stanie nie tylko wiedzieć, że są tam prawidłowe obrazy, ale także je kontrolować.
Nazca

To pytanie jest ważne, ponieważ jego wymaganie dotyczy środowiska Windows, obsługującego bardzo ograniczoną grupę odbiorców. Na przykład napotkałem ten sam problem podczas projektowania serwera internetowego opartego na Arduino, w którym jedynym klientem był komputer z systemem Windows w tej samej sieci LAN co serwer Arduino. Arduino zbyt wolno dostarczało obrazy do klienta, więc musiałem przechowywać obrazy na samym komputerze klienckim.
PrashanD

1

Widzę dwie możliwości tego, co próbujesz zrobić:

  1. Chcesz, aby Twoja strona internetowa działająca na serwerze znajdowała plik na komputerze, na którym została zaprojektowana?

  2. Chcesz, żeby pobierał go z komputera, który przegląda stronę?

Opcja 1 po prostu nie ma sensu :)

Opcja 2 byłaby luką w zabezpieczeniach, przeglądarka uniemożliwia stronie internetowej (obsługiwanej z sieci) ładowanie treści na komputer przeglądarki.

Kyle Hudson powiedział ci, co musisz zrobić, ale to jest tak podstawowe, że trudno mi uwierzyć, że to wszystko, co chcesz zrobić.


1

jeśli używasz przeglądarki Google Chrome, możesz używać w ten sposób

<img src="E://bulbpro/pic_bulboff.gif"   width="150px" height="200px">

Ale jeśli używasz przeglądarki Mozila Firefox, musisz dodać „plik” np.

<img src="file:E://bulbpro/pic_bulboff.gif"   width="150px" height="200px">

3
To nie działało dla mnie w Chrome, ale działa w IE?
ośmiornica

NIE DZIAŁA to w systemach Linux, ale będzie działać dobrze w systemach Windows.
Energetyka

1

Jeśli wdrażasz lokalną witrynę internetową tylko dla siebie lub niektórych klientów, możesz obejść ten problem, uruchamiając mklink /D MyImages "C:/MyImages"w katalogu głównym witryny jako administrator w cmd. Następnie w html, wykonaj, <img src="MyImages/whatever.jpg">a dowiązanie symboliczne utworzone przez mklink połączy relatywne łącze src z łączem na dysku C. Rozwiązał ten problem dla mnie, więc może pomóc innym, którzy przyjdą na to pytanie.

(Oczywiście to nie zadziała w przypadku publicznych witryn internetowych, ponieważ nie można łatwo uruchamiać poleceń cmd na komputerach ludzi)


1

Wypróbowałem wiele technik i ostatecznie znalazłem jedną po stronie C # i stronie JS. Nie możesz podać fizycznej ścieżki do atrybutu src, ale możesz podać ciąg base64 jako src do tagu Img. Spójrzmy na poniższy przykład kodu C #.

<asp:Image ID="imgEvid" src="#" runat="server" Height="99px"/>

Kod C #

 if (File.Exists(filepath)
                            {
                                byte[] imageArray = System.IO.File.ReadAllBytes(filepath);
                                string base64ImageRepresentation = Convert.ToBase64String(imageArray);
                                var val = $"data: image/png; base64,{base64ImageRepresentation}";
                                imgEvid.Attributes.Add("src", val);
                            }

Mam nadzieję, że to pomoże



0

co z tym, aby obraz był czymś wybranym przez użytkownika? Użyć znacznika input: file, a po wybraniu obrazu pokazać go na stronie klienta? Jest to wykonalne w przypadku większości rzeczy. W tej chwili próbuję sprawić, by działał w IE, ale tak jak w przypadku wszystkich produktów firmy Microsoft jest to fork ().


0

zaczyna się file:///i kończy na filenamepowinno działać:

<img src="file:///C:/Users/91860/Desktop/snow.jpg" alt="Snow" style="width:100%;">

Uważaj: ta sztuczka nie zadziała w systemach Linux.
Energetyka
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.