Я работаю над приложением .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
В качестве последнего варианта я могу разрешить эти файлы и заменить #
на что-то другое на сервере, но мне интересно, есть ли способ заставить это работать без изменения имени файла.
@mjwills, манипулирующий именем файла, — мой последний вариант. Я предпочитаю, чтобы это работало с оригинальными именами файлов, потому что мы переносим существующий сайт, и есть несколько файлов с этой проблемой, которые нам нужно поддерживать. (Требование клиента!! Он был разработан другой компанией в прошлом, и эта проблема осталась нерешенной - к сожалению). Если вариантов нет, мы просто изменим имена файлов на что-то другое и заставим это работать.
Вероятно, у вас есть страница Razor (или эквивалент), которая динамически генерирует «кликабельную ссылку».
ПРЕДЛОЖЕНИЕ: используйте HttpUtility.UrlEncode() для явного создания ссылки при обслуживании страницы.
Это должно сгенерировать что-то вроде этого:
invalid # test.pdf
invalid%20%23%20test.pdf
Спасибо за предложение. Я пробовал это, но он сгенерировал другую версию, чем вы опубликовали. Таким образом, в основном пользователь публикует объявление и имеет возможность загружать файлы в редакторе контента. Когда файл загружен, я сохраняю его на сервере и возвращаю URL-адрес местоположения обратно в редактор. Я обновил код, чтобы вернуть закодированную версию имени файла, используя location = $"{baseUrl}\\{Path.Combine(docDirectory, HttpUtility.UrlEncode(file.FileName))}";
, но он сгенерировал invalid+%23+test.pdf
. Тот, который вы разместили в своем ответе, отлично работает.
ОБНОВЛЕНИЕ: я пытался Uri.EscapeUriString()
закодировать пробелы, но проблема #
осталась. Я также пробовал комбинацию, но не работал, потому что %20 снова был закодирован. HttpUtility.UrlEncode(Uri.EscapeUriString(file.FileName))
и Uri.EscapeUriString(HttpUtility.UrlEncode(file.FileName))
, по-видимому, не будут работать по той же причине.
invalid+%23+test.pdf
Это не лучшее долгосрочное решение, но рассматривали ли вы string.Replace
+
и %20
@Pirate?
@mjwills invalid+%23+test.pdf
не работает. Единственный, который работает, - это тот, который опубликован в ответе. Я не рассматривал возможность замены +
, потому что +
разрешено в имени файла. Я пытаюсь избежать манипулирования исходным именем файла на сервере.
@Pirate Прочитайте мой комментарий еще раз. Поскольку, если вы сделаете то, что я предлагаю, вы должны получить рабочее имя файла.
@mjwills хорошо, да, я понимаю, что ты говоришь. Это помогло. Я думал, что +
разрешены в имени файла, поэтому оно тоже будет обновлено, но, поскольку сейчас я использую HttpUtility.UrlEncode
, оно будет закодировано, и +
будет только для пробелов. Большое спасибо, вы спасли мой день!
Почему URL-адрес должен соответствовать имени файла? Вы говорите
When file is uploaded, I save it on the server and return location url back to the editor.
Почему бы не сохранить его как случайное имя файла и вернуть этот URL? Почему это должно соответствовать этому в любом случае?