Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Inside1995
3 / 3 / 1
Регистрация: 04.04.2017
Сообщений: 51
1

В runtime режиме записать файл и сразу его считать. Возможно ли?

08.03.2018, 17:00. Просмотров 901. Ответов 13

Всем доброго времени суток!
Скорее всего по своему незнанию я завел себя в тупик и надеюсь получить помощь.
Хочу создать аналог простейшей соц. сети на Spring. Этап разработки застопорился на выводе главной странички.
При регистрации пользователь может выбрать аватарку, загружая ее через <input type="file">. Картинка ловится на сервере и сохраняется в папку resource. После успешной регистрации, пользователя переносит на его только что созданную страницу, где должна выводиться его аватарка(только что сохраненная на серверный компьютер). Получается, что вэб приложение не перезапускается и требуется возможность сохранить файл и сразу его считать. С помощью дебага я понял, что картинка не грузится только потому что структура проекта не обновляется(в runtime). И загрузить картинку можно только после перезапуска.
Напрашивается решение: найти способ обновить структуру папок перед извлечением картинки, что скорее всего невозможно или сложно осуществляется. Я уверен есть более красивый и простой способ. Наверное смысл код приводить нет. Файл отправляется, ловится на сервере и сохраняется в папку resource успешно. Проблема в том, что view которое отображает профильную страницу не может получить картинку с помощью тега <img src="..."/>, так как папки не обновляются в runtime!
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2018, 17:00
Ответы с готовыми решениями:

Считать файл и записать его в массив
#include &lt;stdio.h&gt; int main() { FILE *f; if ((f =...

Записать в файл массив и считать его
Дан код программы: program hi; const m = 2; n = 4; type mas2= array of...

Записать массив double в файл, и считать его
Допустим есть массив double *pdArrayOfAllWeight = (double*)malloc(sizeof(double)*iSumAllWeight);...

Записать двумерный строковый массив в файл и считать его
Всем привет. Есть задание &quot;Создать файл, содержащий следующую структуру данных: «Фамилия студента;...

Как побайтово считать файл и записать его в массив
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;cstdlib&gt; #include &lt;time.h&gt; #include &lt;string&gt;...

13
xoraxax
1638 / 1489 / 452
Регистрация: 05.07.2013
Сообщений: 7,334
Завершенные тесты: 2
08.03.2018, 17:14 2
а давай ты посмотришь пример на spring.io, например?
0
Inside1995
3 / 3 / 1
Регистрация: 04.04.2017
Сообщений: 51
08.03.2018, 17:26  [ТС] 3
Цитата Сообщение от xoraxax Посмотреть сообщение
а давай ты посмотришь пример на spring.io, например?
Я пытался уже найти решение. Я просто так никогда сюда не пишу. Я уже битый час пытаюсь найти решение. Если есть ссылка, с удовольствием прочту. Ни к чему нагнетать обстановку. Я просто хочу получить помощи от более опытных коллег
0
xoraxax
1638 / 1489 / 452
Регистрация: 05.07.2013
Сообщений: 7,334
Завершенные тесты: 2
08.03.2018, 17:33 4
https://spring.io/guides/gs/uploading-files/

Добавлено через 1 минуту
ну и да, буквально месяц назад тут на форуме была такая же тема. Так что решение ты битый час, похоже, искал под кроватью.
0
08.03.2018, 17:33
Inside1995
3 / 3 / 1
Регистрация: 04.04.2017
Сообщений: 51
08.03.2018, 17:52  [ТС] 5
Цитата Сообщение от xoraxax Посмотреть сообщение
https://spring.io/guides/gs/uploading-files/

Добавлено через 1 минуту
ну и да, буквально месяц назад тут на форуме была такая же тема. Так что решение ты битый час, похоже, искал под кроватью.
Не понимаю твою агрессивность. С чего весь этот пафос? Я нормально задал вопрос. Мне просто нужен ответ. Я не смог найти ответа по ссылке, которую ты мне скинул. Если ответ напрашивается - достаточно просто сказать в какую сторону копать. Не обязательно в чем-то меня упрекать. В жизни не поверю, что у тебя при обучении не возникало вопросов и ты осваивал все с первого раза.
0
xoraxax
1638 / 1489 / 452
Регистрация: 05.07.2013
Сообщений: 7,334
Завершенные тесты: 2
08.03.2018, 18:11 6
ну так возьми код оттуда и посмотри, как работает каждый из методов. Ты ж его даже не запустил.
0
KEKCoGEN
Эксперт Java
2182 / 2034 / 526
Регистрация: 28.12.2010
Сообщений: 8,045
08.03.2018, 22:34 7
Цитата Сообщение от Inside1995 Посмотреть сообщение
Напрашивается решение: найти способ обновить структуру папок
вывод который должен напрашиваться: сохранять картинку по другому пути в стороннюю папку и грузить оттуда.
Ну и читать читать по линку что xoraxax привел выше.
0
Inside1995
3 / 3 / 1
Регистрация: 04.04.2017
Сообщений: 51
09.03.2018, 09:40  [ТС] 8
Я сохранял картинку по другому пути, проблему это не решило. В runtime состояние папок не обновляется!
0
KEKCoGEN
Эксперт Java
2182 / 2034 / 526
Регистрация: 28.12.2010
Сообщений: 8,045
09.03.2018, 12:16 9
Inside1995, по какому другому? Надо сохранять картинку вне проекта. Тогда ничего не надо обновлять. Сохраняйте в /tmp/user-data например.
1
Inside1995
3 / 3 / 1
Регистрация: 04.04.2017
Сообщений: 51
10.03.2018, 08:36  [ТС] 10
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Inside1995, по какому другому? Надо сохранять картинку вне проекта. Тогда ничего не надо обновлять. Сохраняйте в /tmp/user-data например.
Сохранял картинку уже и в проекте, и вне его. Проблема остается! Вижу что картинка появляется в нужной папке, но <img src.../> все равно ее подгрузить не может. Только после того как перезапущу сервер, получается загрузить картинку. Даже когда в проекте сохранял картинку и запускался в дебаг моде, то и без обновления было видно, что картинка появилась. Может есть другой способ подгрузить картинку?
0
KEKCoGEN
Эксперт Java
2182 / 2034 / 526
Регистрация: 28.12.2010
Сообщений: 8,045
10.03.2018, 10:35 11
Inside1995, покажите код как вы строите URL картинки. У вас должна быть замаплена папка со статическими ресурсами.
0
Inside1995
3 / 3 / 1
Регистрация: 04.04.2017
Сообщений: 51
10.03.2018, 11:33  [ТС] 12
1.На счет маппинга, я так понял, Вы хотите увидеть вот это: <mvc:resources mapping="/resources/**" location="/resources/"/>
2.URL картинки строю так:
HTML5
1
<img src="/resources/profile_images/${user.id}.jpeg" height="300px" width="100px"/>
, где user это модель, которую я передаю через контроллер. В итоге, когда создаю новый профиль и сохраняю картинку, я присваиваю картинке имя, состоящее из id юзера и расширения .jpeg. То есть получается что то вроде 35.jpeg. Эта картинка помещается в папку, где лежат другие стат. ресурсы и я вижу что она там появилась, но вот <img src/> ее не ищет. Зато, если перезапустить сервер, он эту картинку найдет.
На всякий случай вот код контроллера, который отправляет на "проблемную" view (однако я думаю проблема не здесь) :
Java
1
2
3
4
5
6
 @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public String showUserProfile(@PathVariable int id, Model model) {
        User user = userDaoService.getUserById(id);
        model.addAttribute("user", user);
        return "users/profile";
    }
И на всякий случай код, который сохраняет картинку:
Java
1
2
3
4
5
6
7
8
private void saveImage(String s, MultipartFile multipartFile) {
        File file = new File("/resources/profile_images/" + s); 
        try {
            FileUtils.writeByteArrayToFile(file, multipartFile.getBytes());
        } catch (IOException e) {
            throw new ImageUploadException("Image can not be saved");
        }
    }
Здесь "s" это имя файла, который как я говорил раньше имеет вид id.jpeg

Добавлено через 31 минуту
В общем, огромное спасибо всем, кто пытался мне помочь. Я таки смог найти ответ. Не самый элегантный, но все же рабочий. В общем суть в том, чтобы не сохранять картинку в папку, а сделать ее полем в классе User, что является entity-классом и в дальнейшем записывается в БД. При создании пользователя, картинка сохраняется в поле byte[] photo. Когда дело доходит до view, то <img src/> просит картинку не с жесткого диска как раньше, а по url адресу "users/photo/id", запрос которого летит к контроллеру, который помечен @ResponseBody и возвращает byte[] фото пользователя. В итоге все хорошо отображается, но в душе осталось чувство, что это костыль, а не хороший код. Как бы то ни было, костыль рабочий.
Вот пример контроллера:
Java
1
2
3
4
5
6
@RequestMapping(value = "/photo/{id}", method = RequestMethod.GET)
    @ResponseBody
    public byte[] downloadPhoto(@PathVariable("id") int id) {
        User user = userDaoService.getUserById(id);
        return user.getPhoto();
    }
А также сам класс маппит запросы вида "/users", поэтому "users/photo/id" летит сюда.
Еще раз всем спасибо!
0
KEKCoGEN
Эксперт Java
2182 / 2034 / 526
Регистрация: 28.12.2010
Сообщений: 8,045
10.03.2018, 12:34 13
Лучший ответ Сообщение было отмечено Inside1995 как решение

Решение

Цитата Сообщение от Inside1995 Посмотреть сообщение
просит картинку не с жесткого диска как раньше, а по url адресу "users/photo/id", запрос которого летит к контроллеру, который помечен @ResponseBody и возвращает byte[] фото пользователя
Все верно. Только этот контроллер должен ходить не в БД, а на диск где лежит картинка. Там он её без проблем найдет.
0
Inside1995
3 / 3 / 1
Регистрация: 04.04.2017
Сообщений: 51
10.03.2018, 14:14  [ТС] 14
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Все верно. Только этот контроллер должен ходить не в БД, а на диск где лежит картинка. Там он её без проблем найдет.
Спасибо огромное за помощь!
0
10.03.2018, 14:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2018, 14:14

Считать текст из файла, преобразовать его и записать в другой файл
Имеется текстовый файл input.txt, в котором написан текст, с использованием знаков препинания, ...

Win32: как записать односвязный список в файл, а потом его считать?
Добрый день. Подскажите, как записать односвязный список в файл, а потом его считать. Спасибо)

Считать текст из файла и записать его в другой файл, заменив каждую первую букву слов
Доброго времени суток Нуждаюсь в помощи. Есть задание: программа должна считывать английский...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru