Как вы уже догадались, из соображений безопасности ни один из основных браузеров не предоставляет вам доступ к фактическому пути к файлу, выбранному пользователем. Код вашего сервера не получит реальный путь, и даже JavaScript не имеет доступа к нему. Вместо этого браузер генерирует поддельный путь, и единственное реальное значение в нем - это имя файла.
По этой причине единственный способ сохранить файл в вашем текущем дизайне (то есть стандартной форме) после формыПредставляется так, как вы это сделали, как вы описали в своем вопросе. Очевидно, что это не очень хороший способ, особенно если файл слишком большой, поэтому каждое обратное путешествие на сервер займет много времени.
Чтобы решить его по-другому, вам нужно будет изменить дизайн. Вам нужно, чтобы браузер сохранил значение реального пути. Единственный способ сделать это, не отправляя форму. Таким образом, вам нужно отправить значения формы без отправки формы. Единственный способ сделать это, о котором я могу подумать, это отправить форму с помощью Ajax. Это означает, что результат проверки на стороне сервера должен будет возвращаться как ответ Ajax (обычно JSON, но может быть сериализован другими способами, если хотите), а затем JavaScript примет этот ответ и отобразит ошибки в форме кактребуется. Таким образом, файл по-прежнему повторно отправляется на сервер каждый раз, но, по крайней мере, серверу не нужно отправлять его обратно клиенту, как описано в вопросе. Это экономит половину полосы пропускания, но требует больше программирования. Это все еще не рекомендуется, если файл может быть большим. В этом случае, вероятно, лучше позволить пользователю повторно выбрать файл, а не ждать долгое время для повторной загрузки файла.
Чтобы добавить помощника Ajax в .Net Core, вы можетеПросто скачайте файл JavaScript из проекта GitHub и укажите ссылку на него в заголовке вашего HTML. Однако я предпочитаю ссылаться на него только на тех страницах, где мне это нужно, потому что большинству страниц это не нужно. Что я делаю, сначала создаю для него частичное представление:
<environment names="Development">
<script src="~/lib/jquery-ajax-unobtrusive/dist/jquery.unobtrusive-ajax.js"></script>
</environment>
<environment exclude="Development">
<script src="~/lib/jquery-ajax-unobtrusive/dist/jquery.unobtrusive-ajax.min.js"></script>
</environment>
Вы можете использовать CDN, если хотите. Я не могу найти CDN, кроме cdn.jsdelivr.net, и не могу найти хороший резервный тест, поэтому я оставил asp-fallback-test
пустым:
<environment names="Development">
<script src="~/lib/jquery-ajax-unobtrusive/dist/jquery.unobtrusive-ajax.js"></script>
</environment>
<environment exclude="Development">
<script src="https://cdn.jsdelivr.net/npm/jquery-ajax-unobtrusive@3.2.6/dist/jquery.unobtrusive-ajax.min.js"
asp-fallback-src="~/lib/jquery-ajax-unobtrusive/dist/jquery.unobtrusive-ajax.min.js"
asp-fallback-test=""
crossorigin="anonymous"
integrity="sha256-PAC000yuHt78nszJ2RO0OiDMu/uLzPLRlYTk8J3AO10="></script>
</environment>
В любом случае, назовите этот файл как угодно, скажем так_AjaxScriptsPartial.cshtml
. Теперь в представлении, где вам это нужно, добавьте его следующим образом:
@section Scripts {
@{ await Html.RenderPartialAsync("_AjaxScriptsPartial"); }
}
Вот хорошее объяснение того, как его использовать: Использование ненавязчивого Ajax в страницах Razor .
Кроме того, вы можете сохранить свой текущий дизайн, но вместо сериализации файла и отправки его обратно в браузер, сохраните его на сервере и отправьте URL-адрес в браузер. Теперь в JavaScript замените поле ввода файла простым сообщением, например «Файл успешно загружен» или любым другим способом, чтобы указать пользователю, что файл не нужно выбирать повторно. После повторной отправки формы и успешной проверки всех серверов получите физический файл на сервере. Ваш код должен знать, загружать ли файл или получать его с сервера (проверяя, есть ли в поле ввода файла файл). Это также должно знать, где взять это на сервере. Этот способ будет хорошо работать для файлов любого размера, потому что файлы загружаются только один раз, но требуют некоторой работы.