Я пытаюсь изменить способ обработки загруженных файлов перед сохранением их на диск. У нас были некоторые проблемы, когда пользователи операционных систем, отличных от Windows, загружали файлы с символами, которые недопустимы в именах файлов Windows.
Мой идеалист говорит мне, что имена файлов должны быть легальными как можно ближе к веб-слою. Таким образом, мы используем одно и то же правильное имя файла во всей бизнес-логике и на уровне данных.
На практике это требует от нас активной очистки имен файлов в нескольких местах, а затем доверять этому позже. Это проблема, так как она намного более подвержена ошибкам программиста, если у вас нет только одной точки входа для файлов из Интернета.
Другой вариант, который я вижу, - это обертывание файла ввода-вывода с использованием методов очистки имен файлов. Это невозможно сделать невидимым способом, так как иногда нам нужно хранить имена файлов в БД. Если имя файла не изменяется до тех пор, пока оно не будет сохранено на диске, в БД будет указано неправильное имя файла. Это опять-таки не имеет значения, если бы все обращения к файловой системе проходили через одни и те же методы очистки имен файлов, за исключением того, что на практике ваш операционный отдел захочет выполнять некоторые скриптовые задания для перемещения файлов, иногда считывая имена файлов из БД.
Один из способов обойти второй вариант - вернуть новое имя файла, если оно было изменено в результате очистки. Это требует, чтобы пользователь метода знал об этом и обрабатывал его правильно. Как это:
public static FileStream CreateFile(string filename, out string newFileName)
{
newFileName = FileNameSanitiser.GetSanitisedFullPath(filename);
return System.IO.File.Create(newFileName);
}
Что касается варианта 1, у нас должна быть только одна или две конечные точки загрузки файлов. Это сделало бы этот вариант более осуществимым. Думаю, стоит потратить на это время, но я не уверен, что мой менеджер согласен с этим ...