Проверить существует ли файл js
Подскажите, пожалуйста, как можно на JavaScript проверить существование файла на сервере?
Суть в следующем: JS-код должен подсунуть в img.src путь к картинке, если она существует. Если же ее нет, то нужно подкинуть путь до дефолтовой картинки.
Нарыл только способ через FileSystemObject, но это на локальной машине.
типа того. через jquery. укажи только нужный селектор. в данном случае для всех картинок, если они не найдены, указывается путь def.jpg
по такому же принципу можешь сделать на чистом js.
У меня сейчас сделано так же. Картинка меняется раз в секунду, в результате если не может подргузить изображение, происходит моргание. Заказчик требует сделать без моргания. Потому и хочу перед присвоением src проверять существование файла
наверное, будет лучше, если делать проверку на существование файлов на стороне сервера, и выдавать список всех валидных картинок, как вариант через ajax.
с дефолтной картинкой тоже беда, и она ведь может неожиданно исчезнуть)
Есть идея, но не пробовал, вставлять картинку в скрытый блок и у img проверять свойство width или height на 0 , если все хорошо, то показать блок
А вообще чтобы не мерцало, нужно готовить очередь картинок для показа заранее, например подгружать на 3-4 позиции вперед динамически
ну вот так еще извернуться можно)
но это как то "нездорово") слишком много лишних запросов будет.
наверное, будет лучше, если делать проверку на существование файлов на стороне сервера, и выдавать список всех валидных картинок, как вариант через ajax. |
Слишком много запросов получится на сервер.
Опишу ситуацию более подробно: мне нужно вывести трансляцию с IP-камеры на сайт. Камера кидает на сервер каждую секунду картинку.
Соответственно, я эти картинки считываю через JS и каждую секунду меняю на сайте. Если удалось считать изображение, я его сую в beforeImg. Если не удалось считать, на onError в картинку подсовываю последний beforeImg.
А вообще чтобы не мерцало, нужно готовить очередь картинок для показа заранее, например подгружать на 3-4 позиции вперед динамически |
Дело в том, что камеры в режиме охраны, т.е. включаются только на движение. Соответственно, если пол часа нет движения, то пол часа нет новых кадров. Потому загружать по 3-4 не имеет смысла. На этот случай каждый последний кадр, снятый камерой называется last.jpg, именно его я и подтягиваю.
Спасибо за предложенные решения, но сделал по-своему - без аякса.
Сделал что-то типа двойной буферизации
в коде создаю еще один Image и пытаюсь загрузить изображение в него. Если загрузилось, то это же изображение пихаю в отображаемый имейдж. Если не загрузилось, в отображаемое кидаю beforeImg.
Что-то вроде такого:
How do i check the existence of a file?
In the documentation for the module fs there's a description of the method fs.exists(path, callback) . But, as I understand, it checks for the existence of only directories. And I need to check the file!
How can this be done?
20 Answers 20
Why not just try opening the file ? fs.open('YourFile', 'a', function (err, fd) < . >) anyway after a minute search try this :
For Node.js v0.12.x and higher
Both path.exists and fs.exists have been deprecated
Anyone reading this now (Node.js v0.12.x) keep in mind that fs.exists and fs.existsSync have also been deprecated. The best way to check file existence is fs.stat , as demoed above.
From Node js documentation, seems like the best way to go if you plan on opening the file after checking its existence, is to actually open it and handle the errors if it doesn't exists. Because your file could be removed between your exists check and the open function.
Edit: Since node v10.0.0 we could use fs.promises.access(. )
Example async code that checks if file exists:
An alternative for stat might be using the new fs.access(. ) :
minified short promise function for checking:
expanded Promise way:
or if you wanna do it synchronously:
In the documentation I find fs.constants.F_OK etc. Is it also possible to access them like fs.F_OK ? Weird. Also terse, which is nice.
Could try doing it with fs.promises.access(path, fs.constants.F_OK); to simply make it a Promise instead of creating a Promise.
This code is so ugly compared to the simple fs.exists one. really wonder why they force us to use such alternatives :'-(
A easier way to do this synchronously.
The API doc says how existsSync work:
Test whether or not the given path exists by checking with the file system.
Synchronous is "easier", but it's also categorically worse because you block the whole process waiting for I/O and other tasks can't make progress. Embrace promises and asynchrony, which the app probably has to use anyway if it's nontrivial.
Modern async/await way ( Node 12.8.x )
We need to use fs.stat() or fs.access() because fs.exists(path, callback) now is deprecated
Another good way is fs-extra
A couple characters shorter and maybe easier to read: const fileExists = path => fs.promises.stat(path).then(() => true, () => false);
The link you provided for fs.existsync clearly stats that it is NOT deprecated "Note that fs.exists() is deprecated, but fs.existsSync() is not. (The callback parameter to fs.exists() accepts parameters that are inconsistent with other Node.js callbacks. fs.existsSync() does not use a callback.)"
At the time this answer was written, the info was correct; however, fs.existsSync() is no longer deprecated.
UPDATE
There are a lot of inaccurate comments about fs.existsSync() being deprecated; it is not.
Note that fs.exists() is deprecated, but fs.existsSync() is not.
After reading all posts:
According to the documentation: "fs.exists() is deprecated, but fs.existsSync() is not. The callback parameter to fs.exists() accepts parameters that are inconsistent with other Node.js callbacks. fs.existsSync() does not use a callback."
@Fox: great answer! Here's a bit of an extension with some more options. It's what I've been using lately as a go-to solution:
fs.exists has been deprecated since 1.0.0. You can use fs.stat instead of that.
Here is the link for the documentation fs.stats
async/await version using util.promisify as of Node 8:
After a bit of experimentation, I found the following example using fs.stat to be a good way to asynchronously check whether a file exists. It also checks that your "file" is "really-is-a-file" (and not a directory).
This method uses Promises, assuming that you are working with an asynchronous codebase:
If the file does not exist, the promise still resolves, albeit false . If the file does exist, and it is a directory, then is resolves true . Any errors attempting to read the file will reject the promise the error itself.
Как проверить, существует ли файл на моем сервере в jQuery или чистом JavaScript?
С помощью jQuery:
вот код для проверки состояния 404, без использования jQuery
аналогичный и более современный подход.
это работает для меня:
я использовал этот скрипт для добавления альтернативного изображения
пока вы тестируете файлы тот же домен это должно работать:
обратите внимание, что в этом примере используется запрос GET, который помимо получения заголовков (все, что вам нужно проверить погоду, файл существует) получает весь файл. Если файл достаточно большой, этот метод может занять некоторое время.
лучший способ сделать это-изменить эту строку: req.open('GET', url, false); to req.open('HEAD', url, false);
при попытке запустить ответ на этот вопрос у меня возникла проблема с разрешениями для разных доменов, поэтому я пошел с:
Кажется, что это работает отлично, надеюсь, что это поможет кому-то!
вот как это сделать ES7, если вы используете Babel transpiler или Typescript 2:
тогда внутри вашего другого async область, вы можете легко проверить, существует ли url:
Я использую этот скрипт, чтобы проверить, существует ли файл (также он обрабатывает проблему перекрестного происхождения):
обратите внимание, что следующая синтаксическая ошибка возникает, когда проверяемый файл не содержит JSON.
Uncaught SyntaxError: неожиданный токен
для клиентского компьютера, это может быть достигнуто путем:
Это моя программа для передачи файла в определенном месте и показывает предупреждение, если он не существует
сначала создает функцию
после использования функции следующим образом
функция JavaScript для проверки наличия файла:
это адаптация к принятому ответу, но я не мог получить то, что мне нужно от ответа, и должен был проверить это, так как это было предчувствие, поэтому я помещаю свое решение здесь.
нам нужно было проверить наличие локального файла и разрешить открывать файл (PDF) только в том случае, если он существует. Если вы опустите URL-адрес веб-сайта, браузер автоматически определит имя хоста-заставляя его работать в localhost и на сервере:
с каким типом сервера вы пытаетесь связаться? Для ответа на запрос может потребоваться написать небольшой сервис.
Это не касается вопроса OP, но для тех, кто возвращает результаты из базы данных: вот простой метод, который я использовал.
если пользователь не загрузил аватар
Я хотел функцию, которая возвращала бы логическое значение, я столкнулся с проблемами, связанными с закрытием и асинхронностью. Я решил так:
В примерах кода используется метод exists, но он Deprecated: Use fs.stat() or fs.access() instead.
Как использовать данные методы для проверки существования файла?
- Вопрос задан более трёх лет назад
- 4283 просмотра
Оценить 3 комментария
iamevg_: Но тамже _все_ написано - accessSync вываливает ехепшн если нет доступа. Иначе просто код дальше исполняется.
До Node v0.10 были рабочими fs.exists() и path.exists()
После, Node >= v0.12
iamevg_: проверка файла на существование - очень редко используется.
Если нужно прочитать файл, правильно будет сразу его читать, а при ошибке - смотреть что за ошибка, связанная что файла нет или нет доступа на чтение. А смотреть перед этим существует файл или нет - не надо!
dummyman: Это я понимаю, у меня другая задача. Создать Коллекцию директорий с именем первой буквы файла. И поместить файлы в свой каталог.
Проверка существования нужна для того чтобы проверить, создана ли директория для этой буквы уже или нет. Если создана то копировать файл в нее, если не создана то создать ее и опять же скопировать туда файл.
iamevg_: создана ли директория для этой буквы уже или нет - так не правильно.
правильно - создавать папку и получать ошибку о том, что она уже создана. (c) unixway
Итак, мой веб-сайт в значительной степени зависит от скриптов и изображений, которые на нем есть, проблема в том, что все это сохраняется в кеш, поэтому пользователи не могут видеть мои обновления, если они не очистят свой кеш или не откроются в режиме частного просмотра. Я пытаюсь создать систему, которая проверяет, нужно ли очищать кеш, и, если да, автоматически очищает его.
Я думал об этом, имея сценарий на странице html, который проверяет, существует ли «sketch1.js», а если нет, очищает кеш и снова тестирует. Затем каждый раз, когда я обновляю файл «sketch.js», я добавляю 1 к числу в конце имени.
Скажите, пожалуйста, что вы думаете о моем идеальном решении, следует ли мне использовать другой метод для очистки моих сайтов? Если нет, как мне проверить, существует ли файл?
Разве вы не можете установить политику кеширования файлов, обслуживаемых вашим сервером?
Я действительно не понимаю, что вы имеете в виду, что такое политика кеширования? Я новичок в хостинге веб-сайтов
@CameronSchoenecker: ответ веб-сервера включает заголовки (метаданные). Некоторые из этих заголовков могут сообщить браузеру, следует ли кэшировать контент и на какой срок.
Ваш сервер - это то, что сообщает вашему браузеру, как долго нужно кэшировать файлы. Если вы хотите изменить способ кэширования данных, вам обычно следует изменить настройку на своем сервере, а не пытаться взломать его с помощью JavaScript на клиенте. Я бы начал с поиска в Google "политики кеширования" или просмотра настроек или документации вашего сервера.
ой! я сделаю это
@CameronSchoenecker: это означает, что вы не запускаете код в браузере для перебора возможных имен файлов. В этом нет ничего, кроме безумия и отчаяния. Вместо этого вы настраиваете свой веб-сервер, чтобы установить более короткое время жизни кеша для рассматриваемых файлов.
@cHao спасибо! Я займусь этим.
Хорошо, я только что связался со службой поддержки своего хостинга, и они говорят, что у них нет возможности редактировать время жизни моего кеша? На самом деле они даже сказали мне использовать для этого java-скрипт.
. что за. У них нет способность? Вам лучше получить бесплатный хостинг, потому что любой достойный хостинг знает, как настроить свои чертовы веб-серверы.
Хорошо, есть предложения, как решить мою проблему с javascript?
Есть "window.location.reload (true);" который перезагрузит кеш, но эта проблема заключается в том, чтобы знать, когда его вызывать
Как я уже сказал . безумие и отчаяние. Лучше всего иметь отдельный сценарий загрузчика, который знает URL и каждый раз добавляет в конец случайно сгенерированную строку запроса. Но это в основном означает, что ваш основной скрипт никогда не будет кэшироваться, и в результате ваши страницы могут загружаться заметно медленнее.
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной.
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом.
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека.
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а.
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
Ответы 1
Отвечая на ваши вопросы о проверке файлов (для ознакомления):
Это правда, чтобы проверить, существует ли изображение, вы можете использовать функцию loadImage. Таким образом, вы можете попытаться предварительно загрузить изображение в переменную и проверить, существует ли объект (см. Справочник P5, чтобы узнать, как это сделать).
Теперь о проблеме кеширования:
Фактически, до недавнего времени в javascript не было возможности очищать кеш (только несколько браузеров это реализовали, и некоторые люди считают, что открытие этого уровня браузера для разработчика представляет угрозу безопасности). Поэтому, даже если вы проверите наличие файлов, вы не сможете гарантировать, что во всех браузерах будет очищено 100% кешей.
Один из подходов - версия для папок с файлами, а не для самих файлов. Например, каждая «новая версия» вашего «script.js» будет иметь такие URL-адреса:
В сочетании с тем, как браузеры обрабатывают кеш файла .HTML, вы можете получить преимущества кеширования для активов (js, изображений и т. д.) На вашей странице, в то время как версия их папки не изменяется в базовых файлах .HTML.
Читайте также: