Два способа хранения файлов
Редко но метко встает вопрос о хранении файлов (изображений, документов, архивов и так далее). Решил на примерах рассказать о двух популярных способах. Я не писатель, но попробую.
Пример 1:
Необходимо сохранять изображения в файловой системе. Свести все изображения к одному размеру. В данном примере я использую стандартный ASP Control FileUpload.
if (FileUploader.HasFile)
{
System.Drawing.Image img = System.Drawing.Image.FromStream(FileUploader.PostedFile.InputStream);
// сведем размеры изображения к какому-нибудь стандарту
// в данном примере 50x50
decimal width = img.Width;
height = img.Height;
if (width > height) // альбом
{
height = (height / (width / 50));
width = 50;
}
else // документ
{
width = width / (height / 50);
height = 50;
}
System.Drawing.Image miniImg = img.GetThumbnailImage((int)decimal.Round(width), (int)decimal.Round(height), null, IntPtr.Zero);
string path = Server.MapPath("~/") + "images\\" + FileUploader.PostedFile.FileName;
using (FileStream newFile = File.Create(path))
{
int smallLen = (int)ms.Length;
byte[] smallPic = new byte[smallLen];
smallPic = ms.ToArray();
newFile.Write(smallPic, 0, smallLen);
}
ms.Dispose();
ms.Close();
}
При необходимости можно сохранить ссылку на файл где-нибудь в базе данных. Необходимо учитывать, что размер файла может быть большим. Во избежании проблем используем maxRequestLength в Web.config.
maxRequestLength — максимальный размер запроса в килобайтах. По умолчанию используется размер 4096 КБ (4 МБ).
<configuration> <httpRuntime maxRequestLength="4096"/> ... </configuration>
Результат:
Имеем в каталоге «images» изображение размером не шире и не выше 50px, соответственно и вес меньше чем предположено загруженный файл весом до 4МБ.
Пример 2:
Необходимо сохранить файл в базе данных. Не буду ставить никаких дополнительных условий.
byte[] bData = null;
if (FileUploader.HasFile)
{
bData = new byte[FileUploader.PostedFile.ContentLength];
FileUploader.PostedFile.InputStream.Read(bData, 0, FileUploader.PostedFile.ContentLength);
// сохраняем наш массив байт bData в базу данных
}
Отдать файл:
//data - объект который хранит массив байт нашего файла и его имя с расширением
byte[] _file = data.FileData.ToArray();
string fileName = Server.UrlEncode(data.FileName); //в IE7 есть проблемы с русскими буквами
HttpContext.Current.Response.Buffer = true;
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ContentType = "application/x-download";
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";");
HttpContext.Current.Response.OutputStream.Write(_file, 0, _file.Length);
HttpContext.Current.Response.End();
Результат:
Загружаем файл в базу данных и отдаем его при необходимости.
Послесловие
Вот так не многословно. Может кому-нибудь и пригодится.