TransmitFile с именем файла, содержащим пробелы
В C# ASP.Net Website, для передачи файла клиенту я использую
Stirng file_path=Server.MapPath("~/files/"+file_name);
HttpContext.Current.Response.ContentType = "application/octet-stream";
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + file_Name);
HttpContext.Current.Response.TransmitFile(file_path);
HttpContext.Current.Response.End();
Это работает отлично, но когда имя файла содержит пробелы, загруженный файл имеет имя только до первого слова. Например: если мое имя файла "Это demo.txt", то имя загруженного файла становится "Это" без расширения. Следовательно, пользователь, загружающий его, не может определить его тип.
Как мы можем избежать этого для имени файла, содержащего пробелы?
Я пытался с помощью
Stirng file_path="'"+Server.MapPath("~/files/"+file_name)+"'";
Но не сработало.
РЕДАКТИРОВАТЬ:
Также я не могу заменить (на '_' или '-') или удалить все пробелы, присутствующие в имени файла, которые присутствуют на сервере. Небольшая помощь очень ценится.
1 ответ
Вы должны заключить имя файла в кавычки.
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + file_Name + "\"");
И если вы используете VS2015 или новее, вы можете сделать его немного более аккуратным с помощью интерполяции строк:
HttpContext.Current.Response.AddHeader("Content-Disposition", $"attachment;filename=\"{file_Name}\"");
Кроме того, имя файла в заголовке не обязательно должно совпадать с именем файла. Имя файла в заголовке является только предложением для пользователя.
Для получения полной информации см. RFC 6266 "Использование поля заголовка расположения содержимого в протоколе передачи гипертекста (HTTP)", особенно относительно того, какие символы могут вызвать проблемы в имени файла.