Обычно я стараюсь никогда не выставлять загружаемые файлы напрямую.
Вместо этого я пишу обработчик ASHX («Универсальный обработчик» в Visual Studio), который выбирает и отправляет файл в браузер пользователя.
По сути, вы передаете уникальный идентификатор в обработчик (например, чистое имя файла), а обработчик делает все остальное, чтобы извлечь файл локально и передать его в браузер, как показано в этом псевдокоде:
public class MyHandler :
IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
var fileName = Request[@"fn"];
var filePath = Path.Combine(@"C:\My\Fixed\File\Path", fileName );
Response.ContentType = @"application/pdf";
Response.AddHeader(
@"Content-Disposition",
@"attachment; filename=" + Path.GetFileName(filePath));
Response.AddHeader(
@"Content-Length",
new FileInfo(filePath).Length );
Response.WriteFile(filePath);
Response.End();
}
public bool IsReusable
{
get { return false; }
}
}
Преимущества такого подхода в том, что вы имеете полный контроль над тем, загружается ли файл и каким образом.Некоторые сценарии включают в себя:
- Проверка прав доступа, вошел ли пользователь в систему и может ли он загрузить файл.
- Потоковая передача с разными именами файлов клиенту.
- Загрузка файла регистрациив базу данных.
- ...