Имя файла .NET с ошибкой # — 404 — Файл или каталог не найден

Я работаю над приложением .NET Core 2.2 (скоро будет обновлено). Существует функция загрузки файлов на сервер, к которым другие пользователи могут получить доступ по ссылке. Все работает очень хорошо. Существуют проверки для предотвращения файлов с определенными символами, включая #. Единственная проблема, с которой я сталкиваюсь, это то, что клиент настаивает на разрешении # в имени файла. При загрузке таких файлов проблем нет, но по ссылке не загружается. Я получаю ошибку Status Code: 404; Not Found. Это была проблема и на устаревшем сайте (ASP.NET WebForms), где он показывал 404 - File or directory not found.. URL-адрес, который я получаю, выглядит так: /_ClientData/NTTF/Announcements/61/Docs/invalid%20#%20test.pdf

В качестве последнего варианта я могу разрешить эти файлы и заменить # на что-то другое на сервере, но мне интересно, есть ли способ заставить это работать без изменения имени файла.

Почему URL-адрес должен соответствовать имени файла? Вы говорите When file is uploaded, I save it on the server and return location url back to the editor. Почему бы не сохранить его как случайное имя файла и вернуть этот URL? Почему это должно соответствовать этому в любом случае?

mjwills 10.12.2020 22:58

@mjwills, манипулирующий именем файла, — мой последний вариант. Я предпочитаю, чтобы это работало с оригинальными именами файлов, потому что мы переносим существующий сайт, и есть несколько файлов с этой проблемой, которые нам нужно поддерживать. (Требование клиента!! Он был разработан другой компанией в прошлом, и эта проблема осталась нерешенной - к сожалению). Если вариантов нет, мы просто изменим имена файлов на что-то другое и заставим это работать.

Pirate 10.12.2020 23:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
684
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вероятно, у вас есть страница Razor (или эквивалент), которая динамически генерирует «кликабельную ссылку».

ПРЕДЛОЖЕНИЕ: используйте HttpUtility.UrlEncode() для явного создания ссылки при обслуживании страницы.

Это должно сгенерировать что-то вроде этого:

  • Имя файла: invalid # test.pdf
  • HttpUtility.UrlEncode: invalid%20%23%20test.pdf

Спасибо за предложение. Я пробовал это, но он сгенерировал другую версию, чем вы опубликовали. Таким образом, в основном пользователь публикует объявление и имеет возможность загружать файлы в редакторе контента. Когда файл загружен, я сохраняю его на сервере и возвращаю URL-адрес местоположения обратно в редактор. Я обновил код, чтобы вернуть закодированную версию имени файла, используя location = $"{baseUrl}\\{Path.Combine(docDirectory, HttpUtility.UrlEncode(file.FileName))}"; , но он сгенерировал invalid+%23+test.pdf. Тот, который вы разместили в своем ответе, отлично работает.

Pirate 10.12.2020 22:39

ОБНОВЛЕНИЕ: я пытался Uri.EscapeUriString() закодировать пробелы, но проблема # осталась. Я также пробовал комбинацию, но не работал, потому что %20 снова был закодирован. HttpUtility.UrlEncode(Uri.EscapeUriString(file.FileName)) и Uri.EscapeUriString(HttpUtility.UrlEncode(file.FileName)), по-видимому, не будут работать по той же причине.

Pirate 10.12.2020 22:53
invalid+%23+test.pdf Это не лучшее долгосрочное решение, но рассматривали ли вы string.Replace+ и %20 @Pirate?
mjwills 10.12.2020 22:55

@mjwills invalid+%23+test.pdf не работает. Единственный, который работает, - это тот, который опубликован в ответе. Я не рассматривал возможность замены +, потому что + разрешено в имени файла. Я пытаюсь избежать манипулирования исходным именем файла на сервере.

Pirate 10.12.2020 22:59

@Pirate Прочитайте мой комментарий еще раз. Поскольку, если вы сделаете то, что я предлагаю, вы должны получить рабочее имя файла.

mjwills 10.12.2020 23:00

@mjwills хорошо, да, я понимаю, что ты говоришь. Это помогло. Я думал, что + разрешены в имени файла, поэтому оно тоже будет обновлено, но, поскольку сейчас я использую HttpUtility.UrlEncode, оно будет закодировано, и + будет только для пробелов. Большое спасибо, вы спасли мой день!

Pirate 10.12.2020 23:12

Другие вопросы по теме