Mam serwer obsługujący stronę HTML i chciałbym udostępnić obraz znajdujący się na dysku lokalnym w systemie Linux. Czytałem, że mogę to wykorzystać, dołączając file://... Jednak w moim przypadku nie działa i podejrzewam, że może nie działać na moim komputerze (Ubuntu 18.04). Nie wystąpił żaden błąd, po prostu img nie wydaje się znaleźć obrazu.

<img src="file:///home/my_user/my_picture.png">

Wynik obrazu z powyższego fragmentu kodu: img wynik z powyższego fragmentu kodu

W tym wątku znalazłem odpowiedź, że współczesna przeglądarka nie pozwala na obsługę plików lokalnych ze względów bezpieczeństwa.

Jeśli tak jest, czy jest jakaś alternatywa?

Myślę o przekazaniu danych bajtów obrazu do klienta i pozwoleniu javascript po stronie klienta skonstruować obraz. Ale niepokoi mnie problem z wydajnością, gdy jest dużo obrazu do przesłania. Myślę też, że jest to dość brzydkie, ponieważ klient ma gwarancję, że będzie na tej samej maszynie co serwer.

1
Darren Christopher 17 grudzień 2019, 08:59
Jeśli mogą przypisać do tego obrazu, mogą również przypisać do jakiegoś pliku, takiego jak password.txt lub employee.xlsx.... Dlaczego nadal chcesz go używać?
 – 
Tân
17 grudzień 2019, 09:07

2 odpowiedzi

file:/// dotyczy plików lokalnych - to jest plików na komputerze, na którym działa przeglądarka.

Jeśli chcesz załadować pliki, których nie ma w Twoim publicznym folderze na serwerze,

  1. Możesz zamontować folder obrazów w folderze publicznym

  2. Utwórz trasę na swoim serwerze, która rozwiąże żądania obrazów do folderu obrazów

2
Charlie 17 grudzień 2019, 09:05
Plik znajduje się na tym samym komputerze co przeglądarka, której używam. Masz pomysł, dlaczego to nie działa? Czy zabezpieczenia uniemożliwiają przeglądarce wyświetlanie za pomocą file:///?
 – 
Darren Christopher
17 grudzień 2019, 09:07
2
Tak. Uniemożliwia stronom internetowym odczytywanie Twoich prywatnych danych. Gdyby było to dozwolone, każda witryna internetowa mogłaby ukraść całą zawartość Twoich plików bez Twojej zgody i analizować, przesyłać gdzieś, a nawet je sprzedawać.
 – 
FZs
17 grudzień 2019, 09:10
Oczywiście plik znajduje się na tym samym komputerze co przeglądarka, ale przeglądarka może przeglądać strony internetowe, które mogą uruchamiać dowolny kod javascript. Jeśli jest dozwolone odczytywanie plików twojego komputera, kto wie, co strony zrobią z plikami twojego komputera, podczas gdy jest to po prostu arbitralny skrypt napisany przez nieznajomych umieszczony na jakiejś stronie internetowej.
 – 
Loi Nguyen Huynh
17 grudzień 2019, 09:24

Jeśli ładujesz img za pomocą protokołu file:///, te pliki znajdują się na komputerze po stronie klienta, a nie na serwerze. I nie znasz ścieżki obrazu na komputerze po stronie klienta, ponieważ każdy komputer klienta jest inny. Następnie, jeśli obraz, który jest twój, a nie klienta, oczywiście musisz go jakoś przenieść, nawet jeśli jest porzucony, lub tylko 1 obraz. Oczywiście możesz zoptymalizować proces przesyłania różnymi metodami, takimi jak przesyłanie danych 64-bajtowych, zmniejszyć rozmiar obrazów, użyć innych serwerów do przesyłania obrazów niż serwer kodu itp. Ale tak czy inaczej, muszę jakoś im to przenieść .

klient ma gwarancję, że znajduje się na tej samej maszynie co serwer

Jak można zagwarantować, że klient będzie na tej samej maszynie co serwer? Czy jest to aplikacja, którą celowo pobrałeś? Jeśli jest to przeglądarka, może to być dowolna witryna w Internecie. Więc twoje zdanie nie jest w kontekście przeglądarki.

Jeśli chcesz czytać obrazy klienta, musisz pozwolić mu wybrać, który obraz pozwolił Ci przeczytać, za pośrednictwem File Reader, wypróbuj poniższy fragment.

function showpreview(e) {
  var reader = new FileReader();
  reader.onload = function (e) {
    document.querySelector('img').src = e.target.result;
  }
  //Imagepath.files[0] is blob type
  reader.readAsDataURL(e.files[0]);
}
<img style="width: 100vw" src="" alt="">
<input type="file" onchange='showpreview(this)'>
0
Loi Nguyen Huynh 17 grudzień 2019, 09:39