Два способа хранения файлов
Редко но метко встает вопрос о хранении файлов (изображений, документов, архивов и так далее). Решил на примерах рассказать о двух популярных способах. Я не писатель, но попробую.
Пример 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();
Результат:
Загружаем файл в базу данных и отдаем его при необходимости.
Послесловие
Вот так не многословно. Может кому-нибудь и пригодится.