Архитектура. Где очистить имена загруженных файлов? - PullRequest
0 голосов
/ 22 октября 2010

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

  1. Мой идеалист говорит мне, что имена файлов должны быть легальными как можно ближе к веб-слою. Таким образом, мы используем одно и то же правильное имя файла во всей бизнес-логике и на уровне данных. На практике это требует от нас активной очистки имен файлов в нескольких местах, а затем доверять этому позже. Это проблема, так как она намного более подвержена ошибкам программиста, если у вас нет только одной точки входа для файлов из Интернета.

  2. Другой вариант, который я вижу, - это обертывание файла ввода-вывода с использованием методов очистки имен файлов. Это невозможно сделать невидимым способом, так как иногда нам нужно хранить имена файлов в БД. Если имя файла не изменяется до тех пор, пока оно не будет сохранено на диске, в БД будет указано неправильное имя файла. Это опять-таки не имеет значения, если бы все обращения к файловой системе проходили через одни и те же методы очистки имен файлов, за исключением того, что на практике ваш операционный отдел захочет выполнять некоторые скриптовые задания для перемещения файлов, иногда считывая имена файлов из БД.

Один из способов обойти второй вариант - вернуть новое имя файла, если оно было изменено в результате очистки. Это требует, чтобы пользователь метода знал об этом и обрабатывал его правильно. Как это:

public static FileStream CreateFile(string filename, out string newFileName)
{
    newFileName = FileNameSanitiser.GetSanitisedFullPath(filename);
    return System.IO.File.Create(newFileName);
}

Что касается варианта 1, у нас должна быть только одна или две конечные точки загрузки файлов. Это сделало бы этот вариант более осуществимым. Думаю, стоит потратить на это время, но я не уверен, что мой менеджер согласен с этим ...

Ответы [ 2 ]

1 голос
/ 22 октября 2010

То, что мы делаем, довольно просто - любой загруженный файл сохраняется в FileSystem с именем, сгенерированным системой (мы используем GUID), а затем в таблице базы данных хранится сгенерированное имя и фактическое имя.Таким образом, пользовательский интерфейс будет отображать фактическое имя для ссылки на скачивание, а фактический обработчик загрузки будет использовать то же самое в заголовках ответов.

1 голос
/ 22 октября 2010

Если загрузка файлов (а также, предположительно, повторная загрузка их) осуществляется только через интерфейс вашего веб-сайта, вы можете переименовать каждый файл с помощью GUID (или другого уникального объекта), а затем сохранить новый файл. имя и старое имя в вашей базе данных.

Кроме того, вы можете хранить содержимое файла в самой базе данных, что полностью исключает ограничения именования файлов Windows. Обратите внимание, что это не обязательно то, что вы хотите сделать - есть плюсы и минусы для обоих способов хранения файлов (то есть диск против базы данных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...