Два способа хранения файлов

13 февраля 2011 г.

Редко но метко встает вопрос о хранении файлов (изображений, документов, архивов и так далее). Решил на примерах рассказать о двух популярных способах. Я не писатель, но попробую.

Пример 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();

Результат:

Загружаем файл в базу данных и отдаем его при необходимости.

Послесловие

Вот так не многословно. Может кому-нибудь и пригодится.

Теги: рубрика Программирование
  • Похожие статьи
  • Предыдущие из рубрики