Атрибут image sr c не отображает локально сохраненное изображение - PullRequest
0 голосов
/ 25 марта 2020

У меня есть изображения, хранящиеся в виде файлов png на локальном сервере, и в БД сохраняется только имя файла. При рендеринге изображений клиенту я комбинирую относительный путь изображения с именем файла из БД, передавая его следующим образом:

<img src='../../public/avatar-pictures/3fVZNShyQRAtBbipvzVrDwDD.png'/>

Но это не работает. В качестве последней попытки отчаяния я даже переместил сам файл png в каталог root клиентского скрипта, и он все равно ничего не выдал.

что вызывает эту проблему?

1 Ответ

0 голосов
/ 25 марта 2020

По умолчанию node.js и Express не обслуживают никаких файлов. Таким образом, вы не можете указать браузеру путь к некоторому месту на жестком диске вашего сервера и ожидать, что веб-сервер отправит файлы. Это не делает этого (в отличие от того, что ожидают люди, знакомые с Apache).

Вам понадобится маршрут на вашем сервере, который указывает на каталог publi c. Есть несколько способов сделать это, но вот один:

<img src='/public/avatar-pictures/3fVZNShyQRAtBbipvzVrDwDD.png'/>

Затем на вашем сервере вы бы использовали промежуточное ПО express.static() для создания маршрута, который ищет URL-адреса, начинающиеся с /public, и будет обслуживать файлы из каталога publi c на жестком диске, которые соответствуют пути URL-адреса:

app.use("/public", express.static("../../public"));

Путь, который вы передаете express.static(), должен указывать на каталог publi c на вашем местный жесткий диск. Вы не раскрываете свою локальную файловую структуру, поэтому я не могу точно сказать, что это должно быть. Приведенный выше пример будет относиться к текущему рабочему каталогу, когда ваша программа была запущена. Возможно, более распространенным является создание пути самостоятельно из каталога модуля. Итак, если каталог public находится на два уровня выше каталога вашего модуля, вы можете сделать это:

app.use("/public", express.static(path.join(__dirname, "../../public")));

И тогда он более конкретно привязан к каталогу вашего модуля и не зависит от текущего рабочий каталог, который можно изменить с помощью кода или способа запуска вашей программы.

Конечно, вы также можете использовать полный путь:

app.use("/public", express.static(path.join("/someVol/users/me/myProject/public")));

Имейте в виду что промежуточное программное обеспечение express.static() открывает все дерево каталогов, на которое вы указываете, для доступа publi c, поэтому вы должны быть абсолютно уверены, что там есть только publi c. По умолчанию express.static() не разрешает .. в путях, поэтому запрос не может выйти из указанного вами каталога.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...