Проблема: следующий код иногда выдает System.ArgumentException: Illegal characters in path
.Правильный способ работы с именами загруженных файлов
var fileName = Path.GetFileName(Request.Files[0].FileName);
Файлы загружены различными конечными пользователями, поэтому я не могу просто делать вид, что этот случай является недопустимым и игнорировать его.
UserAgent
строка неудачных запросов на загрузку обычно указывает на систему Mac. И незаконный характер (в случаях, когда я потрудился расследовать), был некоторым контрольным символом в диапазоне 0-32.
Разумеется, необходим звонок GetFileName()
, потому что иногда HttpPostedFile.FileName
содержит только имя файла, а иногда и полный путь на машине пользователя. Я мог бы сделать что-то глупое, как
var fileName = Request.Files[0].FileName;
foreach (var c in Path.GetInvalidPathChars())
fileName = fileName.Replace(c, '_');
fileName = Path.GetFileName(fileName);
но он просто не чувствует себя хорошо.
Нет ли стандартного «сетевого» способа работы с именами загруженных файлов? Я с трудом принимаю, что я первый столкнулся с этой проблемой.
================================================================================================================================== ====================
Во избежание дальнейших путаниц. Выделенное имя файла: не, используемый для хранения файлов на диске и не должен быть действительным в контексте среды размещения. Он просто необходим для отображения обратно пользователю.
Я считаю, что стандартный способ заключается в создании имени файла на сервере, который не конфликтует с файлами, загруженными другими пользователями. – dtb
it's обычно не стандарт, но я бы сказал, что больше рекомендуется против того, чего нет.например, начальные имена с номерами 1,2,3 ect также помните, что вы должны знать, что файлы могут обрабатывать или не обрабатывать в отношении имени файла. Я бы создал класс Validation и проверил на символы «!», @, #, $,%, ^, &, *, (,), +, =, {,}, [,] вы получаете идею .. создайте аранжировку недействительных символов или строки и разрешите только "_" или " - 'и числа после первого символа ... то, что у вас есть вверху, отлично, но вы только проверяете на «_» подчеркивание, что все другие соглашения об именах будут проходить через – MethodMan
@dtb. Файлы хранятся на диске с именами, сгенерированными ' Guid.NewGuid(). ToString ("п") '. Тем не менее мне нужно представить пользователю оригинальное имя, которое мне нужно каким-то образом разобрать. –