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

13 февраля 2011 г.

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

Пример 1:

Необходимо сохранять изображения в файловой системе. Свести все изображения к одному размеру. В данном примере я использую стандартный ASP Control FileUpload.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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 МБ).

1
2
3
4
<configuration>
 <httpRuntime maxRequestLength="4096"/>
 ...
</configuration>

Результат:

Имеем в каталоге «images» изображение размером не шире и не выше 50px, соответственно и вес меньше чем предположено загруженный файл весом до 4МБ.

Пример 2:

Необходимо сохранить файл в базе данных. Не буду ставить никаких дополнительных условий.

1
2
3
4
5
6
7
byte[] bData = null;
if (FileUploader.HasFile)
{
 bData = new byte[FileUploader.PostedFile.ContentLength];
 FileUploader.PostedFile.InputStream.Read(bData, 0, FileUploader.PostedFile.ContentLength);
 // сохраняем наш массив байт bData в базу данных
}

Отдать файл:

1
2
3
4
5
6
7
8
9
//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();

Результат:

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

Послесловие

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

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