public ActionResult Upload(Models.UploadedFileModel fileinfo) { if (ModelState.IsValid) { //получаем информацию о родительском каталоге FileEntity ParentFolder = Logic.GetFileById(fileinfo.ParentId); //создаём сущность файла и заполняем поля string Extension = ""; string filename = System.IO.Path.GetFileName(fileinfo.UploadedFile.FileName); if (filename.Contains('.')) Extension = filename.Substring(filename.LastIndexOf('.')); FileEntity NewFile = new FileEntity(filename, ParentFolder.Owner, Extension, fileinfo.UploadedFile.ContentLength, DateTime.Now, 0, ParentFolder.FullName + '\\' + filename, AccessType.Private, fileinfo.UploadedFile.ContentType); //сохраняем файл, если не возникает конфликтов с именем try { Logic.UploadFile(ParentFolder.Id, NewFile); fileinfo.UploadedFile.SaveAs(Logic.GetStorageLocation() + '\\' + ParentFolder.FullName + '\\' + filename); return Redirect("~/Account/Storage?id=" + ParentFolder.Id); } catch (ArgumentException e) { //иначе возвращаем ошибку ModelState.AddModelError(e.ParamName, e.Message); } } return View(fileinfo); }
/// <summary> /// Метода RemoveFile удаляет file из файловой системы /// </summary> /// <param name="file"></param> public void RemoveFile(FileEntity file) { if (file.Extension == "folder") new DirectoryInfo(Storage.FullName + '\\' + file.FullName).Delete(); else new FileInfo(Storage.FullName + '\\' + file.FullName).Delete(); return; }
public FileModel(FileEntity file) { ID = file.Id; Name = file.Name; OwnerName = file.Owner.Name; Extension = file.Extension; FullName = file.FullName; UploadDate = file.UploadDate; Access = file.Access; Size = file.Size; Downloads = file.Downloads; }
/// <summary> /// Метод AddFile добавляет информацию о файле в базу данных /// </summary> /// <param name="parid"></param> /// <param name="file"></param>ww /// <returns></returns> public bool AddFile(int parid, FileEntity file) { bool r; if (GetFileByFullName(file.FullName) != null) throw new ArgumentException("Файл с таким именем уже существует.", "UploadedFile"); using (SqlConnection connection = new SqlConnection(ConnectionString)) { SqlCommand command = new SqlCommand("INSERT INTO MegaFileStorage.Files (OwnerID, FileName, Extension, " + "Size, UploadDate, Downloads, FullName, AccessType, ContentType) VALUES(@oid, @n, @e, @s, @ud, " + "@d, @fn, @at, @ct)"); command.Connection = connection; command.Parameters.AddWithValue("@oid", file.Owner.ID); command.Parameters.AddWithValue("@n", file.Name); command.Parameters.AddWithValue("@e", file.Extension); command.Parameters.AddWithValue("@s", file.Size); command.Parameters.AddWithValue("@ud", file.UploadDate); command.Parameters.AddWithValue("@d", file.Downloads); command.Parameters.AddWithValue("@fn", file.FullName); command.Parameters.AddWithValue("@at", file.Access); command.Parameters.AddWithValue("@ct", file.ContentType); connection.Open(); r = command.ExecuteNonQuery() == 1; if (!r) return r; } int chid = GetFileByFullName(file.FullName).Id; using (SqlConnection connection = new SqlConnection(ConnectionString)) { SqlCommand command = new SqlCommand("INSERT INTO MegaFileStorage.Folders (ChID, ParID) VALUES(@c, @p)"); command.Connection = connection; command.Parameters.AddWithValue("@c", chid); command.Parameters.AddWithValue("@p", parid); connection.Open(); return command.ExecuteNonQuery() == 1; } }
public static bool UploadFile(int rootid, FileEntity newfile) { Data.AddFile(rootid, newfile); Data.ChangeDirSize(rootid, (int)newfile.Size); return false; }
public static bool CreateSubfolder(FileEntity root, string name) { Storage.CreateFolder(root, name); return Data.CreateSubFolder(root, name); }
public static void RemoveFile(FileEntity file) { int rootid = GetParentId(file.Id); if (file.Extension == "folder") { foreach (FileEntity f in GetFiles(file.Id)) RemoveFile(f); foreach (FileEntity f in GetSubfolders(file.Id)) RemoveFile(f); } Data.RemoveFile(file.Id); if (rootid != -1) Data.ChangeDirSize(rootid, -(int)file.Size); Storage.RemoveFile(file); return; }
public static bool ChangeAccess(FileEntity file, int access) { return Data.ChangeAccess(file, (AccessType)access); }
/// <summary> /// Метод ChangeAccess изменяет тип доступа файла file на accesstype /// </summary> /// <param name="file"></param> /// <param name="accesstype"></param> /// <returns></returns> public bool ChangeAccess(FileEntity file, AccessType accesstype) { bool r; using (SqlConnection connection = new SqlConnection(ConnectionString)) { SqlCommand command = new SqlCommand("UPDATE MegaFileStorage.Files SET AccessType = @at WHERE " + "FileID = @fid"); command.Connection = connection; command.Parameters.AddWithValue("@at", (int)accesstype); command.Parameters.AddWithValue("@fid", file.Id); connection.Open(); r = command.ExecuteNonQuery() == 1; if (!r) return r; switch (accesstype) { case AccessType.Private: case AccessType.Public: command.CommandText = "DELETE FROM MegaFileStorage.Access WHERE FileID = @fid"; r = command.ExecuteNonQuery() == 1; break; case AccessType.Limited: command.CommandText = "INSERT INTO MegaFileStorage.Access (UserID, FileID) VALUES(@uid, @fid)"; command.Parameters.AddWithValue("@uid", file.Owner.ID); r = command.ExecuteNonQuery() == 1; break; } } return r; }
/// <summary> /// Если параметр f - истина, то метод GetChildren возвращает все подкаталоги каталога с идентификатором id /// В противном случае вернём все содержащиеся в нём файлы /// </summary> /// <param name="id"></param> /// <param name="f"></param> /// <returns></returns> public IEnumerable<FileEntity> GetChildren(int id, bool f) { List<int> ids = new List<int>(); List<FileEntity> files = new List<FileEntity>(); using (SqlConnection connection = new SqlConnection(ConnectionString)) { SqlCommand command = new SqlCommand("SELECT ChID FROM MegaFileStorage.Folders WHERE ParID=@id"); command.Connection = connection; command.Parameters.AddWithValue("@id", id); connection.Open(); using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) ids.Add(reader.GetInt32(0)); } foreach(int i in ids) { if(f) { command.CommandText = "SELECT OwnerID, FileName, UploadDate, FullName, AccessType, Size FROM " + "MegaFileStorage.Files WHERE FileID = @fid AND Extension = 'folder'"; command.Parameters.AddWithValue("@fid", i); using (SqlDataReader reader = command.ExecuteReader()) { if (reader.Read()) { FileEntity folder = new FileEntity(); folder.Id = i; folder.Extension = "folder"; folder.Owner = new User() { ID = reader.GetInt32(0) }; folder.Name = reader.GetString(1).Trim(); folder.UploadDate = reader.GetDateTime(2); folder.FullName = reader.GetString(3).Trim(); switch (reader.GetInt32(4)) { case 0: folder.Access = AccessType.Private; break; case 1: folder.Access = AccessType.Public; break; default: folder.Access = AccessType.Limited; break; } folder.Size = reader.GetInt32(5); files.Add(folder); } } } else { command.CommandText = "SELECT OwnerID, FileName, Extension, Size, UploadDate, Downloads, " + "FullName, AccessType FROM MegaFileStorage.Files WHERE FileID = @fid AND NOT Extension " + "= 'folder'"; command.Parameters.AddWithValue("@fid", i); using (SqlDataReader reader = command.ExecuteReader()) { if (reader.Read()) { FileEntity file = new FileEntity(); file.Id = i; file.Owner = new User() { ID = reader.GetInt32(0) }; file.Name = reader.GetString(1).Trim(); file.Extension = reader.GetString(2).Trim(); file.Size = reader.GetInt32(3); file.UploadDate = reader.GetDateTime(4); file.Downloads = reader.GetInt32(5); file.FullName = reader.GetString(6).Trim(); switch (reader.GetInt32(7)) { case 0: file.Access = AccessType.Private; break; case 1: file.Access = AccessType.Public; break; default: file.Access = AccessType.Limited; break; } files.Add(file); } } } command.Parameters.Clear(); } for (int i = 0; i < files.Count; i++) files[i].Owner = GetUserById(files[i].Owner.ID); } return files; }
/// <summary> /// Метод CreateSubFolder добавляет в базу данных информацию о подкаталоге каталога root с именем name /// </summary> /// <param name="root"></param> /// <param name="name"></param> /// <returns></returns> public bool CreateSubFolder(FileEntity root, string name) { if (GetFileId(root.FullName + '\\' + name) != -1) throw new ArgumentException("Существующее имя каталога.", "Name"); bool r = true; using (SqlConnection connection = new SqlConnection(ConnectionString)) { SqlCommand command = new SqlCommand("INSERT INTO MegaFileStorage.Files (OwnerID, FileName, Extension," + " UploadDate, FullName, AccessType, Size) VALUES(@oid, @n, @e, @ud, @fn, @at, @s)"); command.Connection = connection; command.Parameters.AddWithValue("@oid", root.Owner.ID); command.Parameters.AddWithValue("@n", name); command.Parameters.AddWithValue("@e", "folder"); command.Parameters.AddWithValue("@ud", DateTime.Now); command.Parameters.AddWithValue("@fn", root.FullName + '\\' + name); command.Parameters.AddWithValue("@at", 0); command.Parameters.AddWithValue("@s", 0); connection.Open(); r &= command.ExecuteNonQuery() == 1; } if (!r) return r; int chid = GetFileId(root.FullName + '\\' + name); using (SqlConnection connection = new SqlConnection(ConnectionString)) { SqlCommand command = new SqlCommand("INSERT INTO MegaFileStorage.Folders (ChID, ParID) VALUES(@cd, @pd)"); command.Connection = connection; command.Parameters.AddWithValue("@cd", chid); command.Parameters.AddWithValue("@pd", root.Id); connection.Open(); r &= command.ExecuteNonQuery() == 1; } return r; }
/// <summary> /// Метод GetFileByFullName возвращает файл, полное имя которого соотвествует filename /// </summary> /// <param name="filename"></param> /// <returns></returns> public FileEntity GetFileByFullName(string filename) { FileEntity file = null; using (SqlConnection connection = new SqlConnection(ConnectionString)) { SqlCommand command = new SqlCommand("SELECT FileID, OwnerID, [FileName], Extension, Size, UploadDate, " + "Downloads, FullName, AccessType FROM MegaFileStorage.Files WHERE FullName = @fn"); command.Connection = connection; command.Parameters.AddWithValue("@fn", filename); connection.Open(); using (SqlDataReader reader = command.ExecuteReader()) { if(reader.Read()) { file = new FileEntity(); file.Id = reader.GetInt32(0); file.Owner = new User { ID = reader.GetInt32(1) }; file.Name = reader.GetString(2).Trim(); file.Extension = reader.GetString(3).Trim(); if (!reader.IsDBNull(4)) file.Size = reader.GetInt32(4); file.UploadDate = reader.GetDateTime(5); if (!reader.IsDBNull(6)) file.Downloads = reader.GetInt32(6); file.FullName = reader.GetString(7).Trim(); switch (reader.GetInt32(8)) { case 0: file.Access = AccessType.Private; break; case 1: file.Access = AccessType.Public; break; default: file.Access = AccessType.Limited; break; } } } } return file; }
/// <summary> /// Метод GetAllowedUsers возвращает всех пользователей, которые имеют доступ к файлу file /// </summary> /// <param name="file"></param> /// <returns></returns> public IEnumerable<User> GetAllowedUsers(FileEntity file) { List<User> users = new List<User>(); using (SqlConnection connection = new SqlConnection(ConnectionString)) { SqlCommand command = new SqlCommand("SELECT UserID FROM MegaFileStorage.Access WHERE FileID = @fid"); command.Connection = connection; command.Parameters.AddWithValue("@fid", file.Id); connection.Open(); using (SqlDataReader reader = command.ExecuteReader()) { if (reader.HasRows) while (reader.Read()) users.Add(GetUserById(reader.GetInt32(0))); } } return users; }
/// <summary> /// Метод GetAllFilesOwnedByUser возвращает все файлы, которые загрузил пользователь user /// </summary> /// <param name="user"></param> /// <returns></returns> public IEnumerable<FileEntity> GetAllFilesOwnedByUser(User user) { List<FileEntity> files = new List<FileEntity>(); using (SqlConnection connection = new SqlConnection(ConnectionString)) { SqlCommand command = new SqlCommand("SELECT FileID, [FileName], Extension, Size, UploadDate, " + "Downloads, FullName, AccessType, ContentType WHERE OwnerID = @oid"); command.Connection = connection; command.Parameters.AddWithValue("@oid", user.ID); connection.Open(); using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { FileEntity file = new FileEntity(); file.Id = reader.GetInt32(0); file.Owner = user; file.Name = reader.GetString(1).Trim(); file.Extension = reader.GetString(2).Trim(); if(!reader.IsDBNull(3)) file.Size = reader.GetInt32(3); file.UploadDate = reader.GetDateTime(4); if (!reader.IsDBNull(5)) file.Downloads = reader.GetInt32(5); file.FullName = reader.GetString(6).Trim(); switch (reader.GetInt32(7)) { case 0: file.Access = AccessType.Private; break; case 1: file.Access = AccessType.Public; break; default: file.Access = AccessType.Limited; break; } if (!reader.IsDBNull(8)) file.ContentType = reader.GetString(8); } } for (int i = 0; i < files.Count; i++) files[i].Owner = GetUserById(files[i].Owner.ID); } return files; }
/// <summary> /// Метод GetAllFiles возвращает все файлы, имеющиеся в базе данных /// </summary> /// <returns></returns> public IEnumerable<FileEntity> GetAllFiles() { List<FileEntity> files = new List<FileEntity>(); using (SqlConnection connection = new SqlConnection(ConnectionString)) { SqlCommand command = new SqlCommand("SELECT FileID, OwnerID, [FileName], Extension, Size, UploadDate, " + "Downloads, FullName, AccessType, ContentType FROM MegaFileStorage.Files"); command.Connection = connection; connection.Open(); using (SqlDataReader reader = command.ExecuteReader()) { while(reader.Read()) { FileEntity file = new FileEntity(); file.Id = reader.GetInt32(0); file.Owner = new User(); file.Owner.ID = reader.GetInt32(1); file.Name = reader.GetString(2).Trim(); file.Extension = reader.GetString(3).Trim(); if (!reader.IsDBNull(4)) file.Size = reader.GetInt32(4); file.UploadDate = reader.GetDateTime(5); if (!reader.IsDBNull(6)) file.Downloads = reader.GetInt32(6); file.FullName = reader.GetString(7).Trim(); switch (reader.GetInt32(8)) { case 0: file.Access = AccessType.Private; break; case 1: file.Access = AccessType.Public; break; default: file.Access = AccessType.Limited; break; } if (!reader.IsDBNull(9)) file.ContentType = reader.GetString(9); files.Add(file); } } for(int i = 0; i < files.Count; i++) files[i].Owner = GetUserById(files[i].Owner.ID); } return files; }
/// <summary> /// Метод CreateFolder создаёт подкаталог в каталоге root с именем foldername /// </summary> /// <param name="root"></param> /// <param name="foldername"></param> public void CreateFolder(FileEntity root, string foldername) { Storage.CreateSubdirectory(root.FullName + '\\' + foldername); }