Гость
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / IFormFile - как засунуть назад в <input type="file" /> / 17 сообщений из 17, страница 1 из 1
29.04.2020, 10:01
    #39952717
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFormFile - как засунуть назад в <input type="file" />
День добрый,

Господа, нужна ваша помощь.

Ситуация для наглядности есть страница профайл пользователя с 2мя полями: Имя и User Pic.
Пользователь добавил имя и картинку. - Здесь проблем нет.
Пользователь хочет заменить имя. - Здесь проблема.
Пользователю нужно все снова выбирать картинку.

Причина <input asp-for = "UserPic" type = "file" /> - как бы не получает данные из модели, в модели данные 100% есть.
Уверен потому что <img src = "UserPic.ToImage()" /> - отображает картинку

получается что, чтоб поменять имя, нужно обязательно выбрать картинку снова.

Помогите пожалуйста, а то сам что-то не соображу ни как.
Заранее спасибо.
...
Рейтинг: 0 / 0
29.04.2020, 12:29
    #39952791
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFormFile - как засунуть назад в <input type="file" />
не выбрал картинку, пришло null и не обновляем поле в бд .все ж просто
...
Рейтинг: 0 / 0
29.04.2020, 12:38
    #39952798
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFormFile - как засунуть назад в <input type="file" />
Артем G
получается что, чтоб поменять имя, нужно обязательно выбрать картинку снова.


Да, так и получается.
Файлы из модели данных не возвращаются, только обычные поля.


Артем G
Помогите пожалуйста, а то сам что-то не соображу ни как.


Классическим методом отправки формы сохранить выбранный файл не возможно в принципе.

Чтобы форма сохраняла своё состояние, нужно отправлять форму через AJAX.
...
Рейтинг: 0 / 0
29.04.2020, 16:29
    #39952920
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFormFile - как засунуть назад в <input type="file" />
handmadeFromRu
не выбрал картинку, пришло null и не обновляем поле в бд .все ж просто


Предположу что вы не поняли то, что я имел ввиду.

В контроллере 2 экшена: Create (все хорошо), Update (проблема)

1ый Update - считывает и отображает данные во вью.
Сама модель данные (IFormFile) содержит.
А <input asp-for = "UserPic" type = "file" /> пустой.

НУЖНО чтобы input заполнялся при считывании. Я понимаю что это нужно сделать с помощью jquery.
Продпологаю что данные мои где то все равно есть, типа в httpcontext.request.form.files
Надеюсь что кто нибудь сможет помочь накидать черновой script.

2ой Update - сохраняет данные.
Сейчас приходиться заново выбирать картинку с помощью <input asp-for = "UserPic" type = "file" /> иначе уходит null.

Код: c#
1.
2.
3.
4.
5.
model
   public Profile {
      public string Name {get;set;}
      public IFormFile UserPic {get;set;}
}
...
Рейтинг: 0 / 0
29.04.2020, 16:45
    #39952928
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFormFile - как засунуть назад в <input type="file" />
hVostt
Артем G
получается что, чтоб поменять имя, нужно обязательно выбрать картинку снова.


Да, так и получается.
Файлы из модели данных не возвращаются, только обычные поля.


Артем G
Помогите пожалуйста, а то сам что-то не соображу ни как.


Классическим методом отправки формы сохранить выбранный файл не возможно в принципе.

Чтобы форма сохраняла своё состояние, нужно отправлять форму через AJAX.


Все отлично работает. Не заполняется input только в момент считывания. Тут скорее всего нужен jquery добавить данные в input.

<img src="@Model.FormFile.ToImage()" /> - отображает картинку
<input asp-for="UserPic" type="file" - вероятно пустой, при нажатии save уходит null, приходиться картинку выбирать снова, тогда все ОК.

Вот мой пример. Я упрастил код в контроллере и во вью чтоб поднять читаемость.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
        [HttpGet]
        public async Task<IActionResult> Update(int? id) <-- Отлично работает
        {
            var model = await service.GetUpdateAsync(id);
            return View(model);
        }
        [HttpPost]
        [ValidateAntiForgeryToken()]
        public async Task<IActionResult> Update(UpdateVm model)  <-- Отлично работает
        {
            await service.UpdateAsync(model);
            return RedirectToAction("List");
        }



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
        @model UpdateVm

        <form asp-antiforgery="true" asp-area="" asp-controller="" asp-action="Update" enctype="multipart/form-data">
            <div class="form-group">
                <button class="btn" type="submit" value="Save">
                    save
                </button>
            </div>
            <div class="form-group">
                       Здесь какие то еще например текстовые поля.
            </div>
            <div class="form-group">
                <label asp-for="UserPic" class="col-form-label"></label>
                <div class="custom-file">
                    <input asp-for="UserPic" type="file" class="form-control custom-file-input"  <-- вся проблема здесь при считывании, не заполняется, если нажать сохранить уйдет null, но если повторно выбрать картинку, то все хорошо сохраняется.
                    <label class="custom-file-label"></label>
                </div>
                <span asp-validation-for="UserPic" class="text-danger"></span>
            </div>
            <div class="form-group">
                <img src="@Model.FormFile.ToImage()" /> <-- Отлично работает, в модели IFormFile UserPic заполнен!
            </div>
        </form>
...
Рейтинг: 0 / 0
29.04.2020, 16:59
    #39952939
carrotik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFormFile - как засунуть назад в <input type="file" />
Артем G,

..если речь идет об аватаре, т.е. изображении небольшого размера, то можно конвертить его в base64 и гонять туда-сюда, как строку .. костыль, конечно, но может сработать ...
...
Рейтинг: 0 / 0
29.04.2020, 17:39
    #39952963
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFormFile - как засунуть назад в <input type="file" />
Артем G
<img src="@Model.FormFile.ToImage()" /> - отображает картинку


а вы понимаете что тут происходит?
почему "отображает картинку"?

когда вы разберётесь, то поймёте, что это плохой вариант.
...
Рейтинг: 0 / 0
29.04.2020, 17:44
    #39952966
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFormFile - как засунуть назад в <input type="file" />
carrotik
Артем G,

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


изначально так и хотел. там идиотская история с браузерами при выборе картинки.
тестировал изначально на IE и Chrome. В одном указывается полный путь до файла, в другом только имя с расширением, по этой причине не получалось конвертировать в byte[].

+ эта муть требуется не только для картинок, но и для вообще любых файлов, pdf, ms office, zip.

Проект подошел к концу, единственное что осталось вот эта ерунда. За 2 месяца так и не смог найти решения. А потрачено просто тьма времени. Написал здесь только потому что уже выбился из сил.
...
Рейтинг: 0 / 0
29.04.2020, 17:45
    #39952969
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFormFile - как засунуть назад в <input type="file" />
hVostt
Артем G
<img src="@Model.FormFile.ToImage()" /> - отображает картинку


а вы понимаете что тут происходит?
почему "отображает картинку"?

когда вы разберётесь, то поймёте, что это плохой вариант.


это не продакшен решение. я показываю что модель заполнена.
...
Рейтинг: 0 / 0
29.04.2020, 18:50
    #39953004
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFormFile - как засунуть назад в <input type="file" />
Артем G
Проект подошел к концу, единственное что осталось вот эта ерунда. За 2 месяца так и не смог найти решения. А потрачено просто тьма времени. Написал здесь только потому что уже выбился из сил.


Вы сценарий опишите, как это должно работать.
Непонятно до сих пор чего вы хотите, почему из модели пытаетесь файл на генерируемую страницу HTML засунуть, вообще непонятно чего делаете.
...
Рейтинг: 0 / 0
29.04.2020, 19:25
    #39953032
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFormFile - как засунуть назад в <input type="file" />
hVostt
Артем G
Проект подошел к концу, единственное что осталось вот эта ерунда. За 2 месяца так и не смог найти решения. А потрачено просто тьма времени. Написал здесь только потому что уже выбился из сил.


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


В базе фамилия человека и фото. Пользователь иногда хочет поменять фамилию, а иногда фото.

Есть проблема с фото. Когда открываю страницу для редактирования в поле <input asp-for = "UserPic" type = "file" />
данные null
...
Рейтинг: 0 / 0
29.04.2020, 19:32
    #39953037
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFormFile - как засунуть назад в <input type="file" />
Если гуглить, то все примеры IFormFile на Create, на Update примеров 0!
...
Рейтинг: 0 / 0
29.04.2020, 19:34
    #39953040
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFormFile - как засунуть назад в <input type="file" />
Артем G,

Ну так ваша проблема просто сводится к некоторому непониманию как работает веб и стандартные компоненты браузера.

Такой компонент, как <input type="file" /> невозможно заполнить со стороны сервера, так как его задача -- UPLOAD, но не DOWNLOAD или EDIT. Вам тут не поможет ни ASP.NET ни любой другой фреймворк.

Вот типичная упрощённая форма для загрузки/смены фото:

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<form ..>

...

<label>Ваше лицо</label>
<img src="http://somesite.ru/profile/my-face.jpg" />

<label>Загрузить другое лицо</label>
<input type="file" />

...

<button type="submit">Сохранить</button>

</form>



Обратите внимание на тег <img> в него подставляется ссылка на файл. На самом деле никакого такого файла нет. На запрос "/profile/my-face.jpg" ваш сервер отдаёт текущее фото пользователя из его профиля. А если фото не загружено, отдаёт заглушку в виде специального изображения "NO PHOTO".

Ну и тут тысячи вариаций как это реализовать, примеров много.
...
Рейтинг: 0 / 0
29.04.2020, 19:45
    #39953049
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFormFile - как засунуть назад в <input type="file" />
ок, что делать если надо изменить Фамилию, а фото оставить?
поле <input type="file" /> = null

прописывать логику что если <input type="file" /> = null то фото не меняй?
...
Рейтинг: 0 / 0
29.04.2020, 22:21
    #39953103
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFormFile - как засунуть назад в <input type="file" />
Артем G
ок, что делать если надо изменить Фамилию, а фото оставить?
поле <input type="file" /> = null

прописывать логику что если <input type="file" /> = null то фото не меняй?

да то что я и писал выше где вы указали что я не понимаю
либ мутить отдельную форму загрузки и на эдите не позволять грузить фото
вариантов уйма
...
Рейтинг: 0 / 0
30.04.2020, 06:44
    #39953151
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFormFile - как засунуть назад в <input type="file" />
Артем G
ок, что делать если надо изменить Фамилию, а фото оставить?
поле <input type="file" /> = null

прописывать логику что если <input type="file" /> = null то фото не меняй?


Bingo!
...
Рейтинг: 0 / 0
30.04.2020, 09:18
    #39953174
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFormFile - как засунуть назад в <input type="file" />
handmadeFromRu
Артем G
ок, что делать если надо изменить Фамилию, а фото оставить?
поле <input type="file" /> = null

прописывать логику что если <input type="file" /> = null то фото не меняй?

да то что я и писал выше где вы указали что я не понимаю
либ мутить отдельную форму загрузки и на эдите не позволять грузить фото
вариантов уйма
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / IFormFile - как засунуть назад в <input type="file" /> / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]