写在前面
之前的上传文件的功能,只能上传到根目录,前两篇文章实现了新建文件夹的功能,则这里对上传文件的功能进行适配。
系列文章
[EF]vs15+ef6+mysql code first方式
[实战]MVC5+EF6+MySql企业网盘实战(2)——用户注册
[实战]MVC5+EF6+MySql企业网盘实战(3)——验证码
[实战]MVC5+EF6+MySql企业网盘实战(4)——上传头像
[实战]MVC5+EF6+MySql企业网盘实战(5)——登录界面,头像等比例压缩
[实战]MVC5+EF6+MySql企业网盘实战(5)——页面模板
[实战]MVC5+EF6+MySql企业网盘实战(5)——ajax方式注册
[实战]MVC5+EF6+MySql企业网盘实战(6)——ajax方式登录
[实战]MVC5+EF6+MySql企业网盘实战(7)——文件上传
[实战]MVC5+EF6+MySql企业网盘实战(8)——文件下载、删除
[实战]MVC5+EF6+MySql企业网盘实战(9)——编辑文件名
[实战]MVC5+EF6+MySql企业网盘实战(10)——新建文件夹
[实战]MVC5+EF6+MySql企业网盘实战(11)——新建文件夹2
[实战]MVC5+EF6+MySql企业网盘实战(12)——新建文件夹和上传文件
代码片段
发现如果从数据表中的filePath中获取目录,比较繁琐,干脆在myfile表中添加一个表示目录的字段folderPath,这样获取某个目录下的文件相对更方便一点。同时考虑有文件名称这个字段了,就将filePath这个字段删除了。
所以调整后的代码如下:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Web; using System.Web.Mvc; using System.Web.Script.Serialization; using Wolfy.NetDisk.BLL; using Wolfy.NetDisk.IBLL; using Wolfy.NetDisk.Model; using Wolfy.NetDisk.Utilities; namespace Wolfy.NetDisk.Site.Controllers { public class HomeController : Controller { private IUserInfoServiceRepository _userInfoServiceRepository = new UserInfoServiceRepository(); private IMyFileServiceRepository _myFileServiceRepository = new MyFileServiceRepository(); [HttpGet] public ActionResult FileList() { UserInfo userInfo = Session["user"] as UserInfo; if (userInfo == null) { return RedirectToAction("Login", "UserInfo"); } string folderPath = Request.Params["path"]; Expression<Func<MyFile, bool>> where = null; if (string.IsNullOrEmpty(folderPath)) { where = x => x.User.Id == userInfo.Id && x.FolderPath == "/NetDisk/" + userInfo.UserName + "/"; } else { //保证路径格式一直以/结束 folderPath = folderPath.TrimEnd('/') + "/"; where = x => x.User.Id == userInfo.Id && !x.IsDelete && x.FolderPath == folderPath; } var fileList = _myFileServiceRepository.FindAll(where).OrderBy(x => x.IsFolder).OrderByDescending(x => x.CreateDt); ViewBag.UserInfo = userInfo; ViewBag.ChildTitle = "我的网盘"; return View(fileList); } [HttpPost] public void UploadFile(string filePath) { UserInfo userInfo = Session["user"] as UserInfo; if (userInfo == null) { RedirectToAction("Login", "UserInfo"); } var files = Request.Files; if (files.Count > 0) { var file = files[0]; string fileName = file.FileName; Stream inputStream = file.InputStream; string fileSaveFolder = string.Empty; if (!string.IsNullOrEmpty(filePath)) { filePath = Server.UrlDecode(filePath); fileSaveFolder = Server.MapPath("~/" + filePath); } else { fileSaveFolder = Request.MapPath("~/NetDisk/" + userInfo.UserName); } //如果目标不存在,则创建 if (!Directory.Exists(fileSaveFolder)) { Directory.CreateDirectory(fileSaveFolder); } byte[] buffer = new byte[inputStream.Length]; //判断是否已经超出个人网盘大小 var myFiles = _myFileServiceRepository.FindAll(x => x.User.Id == userInfo.Id); int myDiskSize = 0; if (myFiles.Count() > 0) { myDiskSize = myFiles.Sum(x => x.FileSize); } //如果已经超出网盘大小,则给出提示 if (myDiskSize + buffer.Length > userInfo.NetDiskSize) { AlertMsg("对不起,您的网盘空间不足,请清理后再次上传,或联系管理员进行扩容。", ""); return; } inputStream.Read(buffer, 0, buffer.Length); string strFileMd5 = MD5Helper.GetMD5FromFile(buffer); string fileSavePath = Path.Combine(fileSaveFolder, filePath); fileSavePath = Path.Combine(fileSaveFolder, fileName); //如果文件已经存在 if (System.IO.File.Exists(fileSavePath)) { //对文件进行重命名 fileName = ReNameHelper.FileReName(fileSavePath); fileSavePath = Path.Combine(fileSaveFolder, fileName); } file.SaveAs(fileSavePath); var currentUser = _userInfoServiceRepository.Find(x => x.Id == userInfo.Id); MyFile myFile = new MyFile() { FileMd5 = strFileMd5, ModifyDt = DateTime.Now, IsDelete = false, FileSize = buffer.Length, FolderPath = filePath, FileExt = Path.GetExtension(fileSavePath), CreateDt = DateTime.Now, FileName = fileName, FileIcon = GetFileIcon(Path.GetExtension(fileSavePath)), User = currentUser, IsFolder = 1 }; //保存数据库 _myFileServiceRepository.Add(myFile); _myFileServiceRepository.SaveChanges(); string json = new JavaScriptSerializer().Serialize(myFile); AlertMsg("上传成功", json); } } private void AlertMsg(string msg, string fileJson) { Response.ContentType = "text/html"; Response.Write("<script>parent.showMsg('" + msg + "','" + fileJson + "');</script>"); Response.End(); } private string GetFileIcon(string fileExt) { string fileIconPath = "/Content/Images/"; switch (fileExt.ToLower()) { case ".doc": case ".docx": fileIconPath += "DocType.png"; break; case ".xlx": case ".xlxs": fileIconPath += "XlsType.png"; break; case ".ppt": case ".pptx": fileIconPath += "PptType.png"; break; case ".pdf": fileIconPath += "PdfType.png"; break; case ".apk": fileIconPath += "ApkType.png"; break; case ".dwt": case ".dwg": case ".dws": case ".dxf": fileIconPath += "CADType.png"; break; case ".exe": fileIconPath += "ExeType.png"; break; case ".png": case ".gif": case ".jpg": fileIconPath += "ImgType.png"; break; case ".txt": fileIconPath += "TxtType.png"; break; case ".bt": fileIconPath += "TorrentType.png"; break; case ".rmvb": case ".avi": case ".flv": fileIconPath += "VideoType.png"; break; case ".zip": case ".7z": case ".rar": fileIconPath += "MusicType.png"; break; case ".mp3": fileIconPath += "MusicType.png"; break; default: fileIconPath += "OtherType.png"; break; } return fileIconPath; } /// <summary> /// 文件下载 /// </summary> /// <param name="fileId"></param> public void DownLoadFile(string fileId) { UserInfo userInfo = Session["user"] as UserInfo; if (userInfo == null) { RedirectToAction("Login", "UserInfo"); return; } if (string.IsNullOrEmpty(fileId)) { throw new ArgumentNullException("fileId is errror"); } int id = Convert.ToInt32(fileId); var findFile = _myFileServiceRepository.Find(x => x.Id == id); if (findFile == null) { AlertMsg("文件不存在", ""); return; } string filePath = Request.MapPath("~/" + findFile.FolderPath + "/" + findFile.FileName); //以字符流的形式下载文件 FileStream fs = new FileStream(filePath, FileMode.Open); byte[] bytes = new byte[(int)fs.Length]; fs.Read(bytes, 0, bytes.Length); fs.Close(); Response.ContentType = "application/octet-stream"; //通知浏览器下载文件而不是打开 Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(findFile.FileName, System.Text.Encoding.UTF8)); Response.BinaryWrite(bytes); Response.Flush(); Response.End(); } public void DeleteFile(string fileId) { UserInfo userInfo = Session["user"] as UserInfo; if (userInfo == null) { RedirectToAction("Login", "UserInfo"); return; } if (string.IsNullOrEmpty(fileId)) { throw new ArgumentNullException("fileId is errror"); } int id = Convert.ToInt32(fileId); var findFile = _myFileServiceRepository.Find(x => x.Id == id); if (findFile == null) { AlertMsg("文件不存在", ""); return; } findFile.IsDelete = true; _myFileServiceRepository.Update(findFile); int count = _myFileServiceRepository.SaveChanges(); if (count > 0) { var response = new { code = 4, fileId = findFile.Id }; Response.Write(new JavaScriptSerializer().Serialize(response)); } } public JsonResult EditFileName() { string fileId = Request.Form["fileId"]; string fileNewName = Request.Form["fileNewName"]; UserInfo userInfo = Session["user"] as UserInfo; if (userInfo == null) { RedirectToAction("Login", "UserInfo"); } int id = Convert.ToInt32(fileId); var findFile = _myFileServiceRepository.Find(x => x.Id == id); findFile.FileName = fileNewName; _myFileServiceRepository.Update(findFile); int count = _myFileServiceRepository.SaveChanges(); if (count > 0) { var response = new { code = 200, msg = "更新成功" }; return new JsonResult() { Data = new JavaScriptSerializer().Serialize(response) }; } return new JsonResult() { Data = new JavaScriptSerializer().Serialize(new { code = 500, msg = "保存失败" }) }; } public JsonResult CreateFolder() { UserInfo userInfo = Session["user"] as UserInfo; if (userInfo == null) { RedirectToAction("Login", "UserInfo"); } string folderPath = Server.UrlDecode(Request.Params["folderPath"]); string folderName = Request.Params["folderName"]; if (string.IsNullOrEmpty(folderName)) { throw new ArgumentNullException("文件夹名称不能为空"); } //检查文件夹是否已经存在 Expression<Func<MyFile, bool>> where = null; if (string.IsNullOrEmpty(folderPath)) { where = x => x.User.Id == userInfo.Id && x.IsFolder == 0 && x.IsDelete == false && x.FolderPath == "/NetDisk/Wolfy/"; } else { where = x => x.User.Id == userInfo.Id && x.IsFolder == 0 && x.IsDelete == false && x.FolderPath == folderPath; } var count = _myFileServiceRepository.FindAll(where).Count(); userInfo = _userInfoServiceRepository.Find(x => x.Id == userInfo.Id); if (count > 0) { //如果不存在,则新建,否则进行自动重命名 folderName = folderName + "(" + (count + 1).ToString() + ")"; } if (string.IsNullOrEmpty(folderPath)) { folderPath = "/NetDisk/" + userInfo.UserName; } MyFile folder = new MyFile() { FolderPath = folderPath.TrimEnd('/') + "/", FileName = folderName, CreateDt = DateTime.Now, User = userInfo, FileExt = string.Empty, FileIcon = "/Content/Images/FolderType.png", FileMd5 = string.Empty, FileSize = 0, IsDelete = false, ModifyDt = DateTime.Now }; try { _myFileServiceRepository.Add(folder); _myFileServiceRepository.SaveChanges(); } catch (Exception) { return new JsonResult() { Data = new JavaScriptSerializer().Serialize(new { code = 500, msg = "创建失败" }) }; } return new JsonResult() { Data = new JavaScriptSerializer().Serialize(new { code = 200, folder = folder }) }; } } }