Изображения Asp.NET Core 2 - PullRequest
       1

Изображения Asp.NET Core 2

0 голосов
/ 28 августа 2018

У меня есть пара вопросов об изображениях, так как я не знаю, что лучше для моих целей. Также это может быть полезным для других людей, потому что я не смог найти эту информацию в других вопросах.

Ну, хотя это приложение asp.net core 2.0, первый вопрос может касаться общего вопроса об изображениях.

ВОПРОС 1

Когда у меня есть изображения, которые я хочу загружать каждый раз, я обычно добавляю строку запроса, чтобы исследователи, такие как Chrome или IE, не получали чеканное изображение, которое они имеют. В моем случае я добавляю метки времени в URL изображения, таким образом он загружает изображение каждый раз, так как строка запроса всегда отличается:

filePath += "?" + DateTime.Now.Ticks;

Но в моем случае у меня есть панель, где администраторы страницы могут менять множество изображений. Проблема в том, что при изменении этих изображений при отсутствии строки запроса пользователи увидят старое изображение, которое они сохранили в своем кэше проводника.

Вопрос в том, добавлю ли я строку запроса ко многим изображениям, это не плохо для производительности? Есть ли другое решение для этого?

ВОПРОС 2

У меня также есть фотографии пользователей и другие изображения, хранящиеся на сайте. Когда я увидел изображение, все посетители сайта могут видеть путь (например: www.site.com/user_files/user_001/photo001.jpg). Есть ли способ скрыть эти пути или преобразовать в другую вещь, как ядро ​​asp.net 2.0?

Большое спасибо.

1 Ответ

0 голосов
/ 28 августа 2018

Используя что-то вроде галочек, работа будет выполнена, но очень наивно. Вы будете больше напрягаться как на своем сервере, так и на клиентах, поскольку фактически изображение придется обновлять каждый раз, независимо от того, изменилось оно или нет. Если у вас есть мобильные пользователи, ситуация для них гораздо хуже, так как они будут вынуждены перезагружать все эти ресурсы снова и снова, обычно по ограниченным (и дорогостоящим) тарифным планам.

Гораздо лучший подход - использовать криптографический дайджест, часто называемый "хэш". По сути, одни и те же данные, зашифрованные одинаковым образом, будут возвращать тот же хеш Обычно он используется для обнаружения несанкционированного доступа к передаваемым данным, но поскольку каждое сообщение (как правило) будет иметь уникальный хэш, и этот хэш будет одинаковым каждый раз для одного и того же фрагмента данных, вы также можете использовать его для создания запроса очистки кэша строка, которая изменяется только при изменении самих данных изображения.

Теперь, если быть точным, технически нет гарантии, что два сообщения не приведут к одному и тому же хешу. Случаи, где это происходит, называются «столкновениями», и они могут произойти. Однако, если вы используете достаточно сложный алгоритм, такой как SHA256, вероятность столкновений значительно снижается. Несмотря на это, это не должно быть серьезной проблемой для этого конкретного случая использования изображений с кешем.

Проще говоря, чтобы создать хеш, вы просто делаете что-то вроде:

string hash;
using (var sha256 = SHA256.Create())
{
    hash = Convert.ToBase64String(sha256.ComputeHash(imageBytes));
}

Тогда значение hash будет примерно таким: z1JZs/EwmDGW97RuXtRDjlt277kH+11EEBHtkbVsUhE=.

Однако в ASP.NET Core есть встроенный ImageTagHelper, который с этим справится. По сути, вам просто нужно сделать:

<img src="/path/to/image.jpg" asp-append-version="true" />

Что касается вашего второго вопроса, о сокрытии или запутывании пути к изображению, то это не совсем возможно, но можно обойти. URL, который вы используете для ссылки на изображение, однозначно идентифицирует этот ресурс. Если вы измените его каким-либо образом, он больше не будет тем же ресурсом, и, следовательно, не найдет фактическое изображение, которое вы хотите отобразить. Таким образом, в строгом смысле, нет, вы не можете изменить URL. Однако вы можете прокси-запрос через другой URL, фактически запутывая URL для исходного изображения.

Проще говоря, вы просто выполняете действие на каком-либо контроллере, который принимает путь к изображению (как часть строки запроса), загружает его из файловой системы и возвращает его в качестве ответа. Следует позаботиться об ограничении области действия файлов, которые могут быть возвращены подобным образом, как на основе каталога (разрешить только каталог изображений, например, не C:\Windows\ и т. Д.), Так и типа файла (разрешать возврат только изображений, но не случайные текстовые файлы, файлы конфигурации и т. д.). Эта часть достаточно проста, и вы можете найти много примеров в Интернете, если они вам нужны.

В конечном счете, это на самом деле ничего не решает, потому что теперь ваш путь к изображению находится просто в строке запроса. Однако теперь, когда вы настроили эту часть, вы можете зашифровать эту часть строки запроса с помощью API защиты данных. В docs имеется некоторая базовая информация по началу работы. По сути, вы просто собираетесь зашифровать путь к изображению при создании URL, а затем в своем действии, которое возвращает изображение, вы сначала расшифровываете путь перед запуском остальной части кода. Для части шифрования вы можете создать помощник по тегам , чтобы сделать это для вас, не имея тонны логики в ваших представлениях.

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