2011-12-19 2 views
1

Проблема: следующий код иногда выдает 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); 

но он просто не чувствует себя хорошо.

Нет ли стандартного «сетевого» способа работы с именами загруженных файлов? Я с трудом принимаю, что я первый столкнулся с этой проблемой.

================================================================================================================================== ====================

Во избежание дальнейших путаниц. Выделенное имя файла: не, используемый для хранения файлов на диске и не должен быть действительным в контексте среды размещения. Он просто необходим для отображения обратно пользователю.

+0

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

+0

it's обычно не стандарт, но я бы сказал, что больше рекомендуется против того, чего нет.например, начальные имена с номерами 1,2,3 ect также помните, что вы должны знать, что файлы могут обрабатывать или не обрабатывать в отношении имени файла. Я бы создал класс Validation и проверил на символы «!», @, #, $,%, ^, &, *, (,), +, =, {,}, [,] вы получаете идею .. создайте аранжировку недействительных символов или строки и разрешите только "_" или " - 'и числа после первого символа ... то, что у вас есть вверху, отлично, но вы только проверяете на «_» подчеркивание, что все другие соглашения об именах будут проходить через – MethodMan

+0

@dtb. Файлы хранятся на диске с именами, сгенерированными ' Guid.NewGuid(). ToString ("п") '. Тем не менее мне нужно представить пользователю оригинальное имя, которое мне нужно каким-то образом разобрать. –

ответ

1

Нельзя просто заменить символы. Вы должны проверить имя файла и попросить пользователя исправить его, если он не поддерживается (это совершенно законно, даже у вашей ОС есть ограничения на имена файлов). В противном случае вы можете:

  1. , как вы сказали, заменить недопустимые символы (но, как вы можете убедиться, что вы заменить все возможные недопустимые символы?)
  2. закодировать имя файла
+0

Не похоже на жизнеспособное обходное решение ... Что я им скажу? Удалите код символа X из вашего имени пути? –

1

Если вы просто хотите отобразить имя файла, представленное пользователем, и не обязательно иметь правильное имя файла, вы можете просто отключить любые символы до последнего/или символа:

string result = name.Substring(name.LastIndexOfAny(new[] { '/', '\\' }) + 1); 

(LastIndexOfAny возвращает -1, если нет/или \ не найден, поэтому исходная строка возвращается в этом случае.)

Не забудьте HTML закодировать имя файла при показе его пользователю ,

+0

+1 Это работоспособно, хотя и несовершенно. –

-1

Я обычно добавляю DateTime.Now.Ticks в начало имени файла или идентификатор пользователя (и тики), затем я могу обрабатывать/перемещать файл на основе этих деталей.

Возможно ли, что персонаж, вызывающий проблему, является a. (я не уверен, что окна очень хорошо сочетаются с a. в начале имени файла

Смежные вопросы