Что нужно учесть, прежде чем прийти к решению:
- Будете ли вы горизонтально масштабировать свое веб-приложение (т.е. будете ли вы запускать несколько экземпляров контейнера сервлета).
- Какой трафик вы ожидаете?
- Как быстро необходимо обновить изображение (т. Е. После того, как пользователь меняет свой аватар, если они и все другие пользователи сразу увидят новый аватар).
Для веб-приложения, которое не масштабируется по горизонтали, вы можете использовать файловую систему в качестве хранилища изображений. Это просто, понятно и работает.
Для веб-приложений, которые масштабируются по горизонтали, вам необходимо хранить изображения в месте, доступном для каждого контейнера сервлета. Это может быть база данных (я не рекомендую это), S3 (я рекомендую это) или хранилище контента (я никогда не использовал один из них). Одним из преимуществ S3 является то, что он хорошо масштабируется. Вы можете оставить его позади CloudFront (Amazon CDN) или просто отключить сервер от S3 и сохранить нагрузку на свои серверы.
Вы также упоминаете в своем вопросе, что не можете обслуживать локальный ресурс с удаленных клиентов. Это правильно, вроде ... Я предполагаю, что вы пытаетесь использовать какой-то URL, например file://c:/.../image.jpg
. Это не сработает. Что вам нужно сделать, это сопоставить обработчик для обработки изображения. Это может выглядеть примерно так:
@RequestMapping(value = "/image/{name}.jpg", method = RequestMethod.GET)
public void image(@PathVariable("name") String name, HttpServletResponse response) {
// Read the image from the file system using java.io
// Write the image to the response output stream
// Even better use org.springframework.utils.FileCopyUtils
}