博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[实战]MVC5+EF6+MySql企业网盘实战(8)——文件下载、删除
阅读量:6178 次
发布时间:2019-06-21

本文共 7942 字,大约阅读时间需要 26 分钟。

写在前面

上篇文章通过iframe实现了文件的无刷新上传。这篇我们将实现文件的下载与删除。

系列文章

[实战]MVC5+EF6+MySql企业网盘实战(8)——文件下载、删除

核心代码

上篇实现文件的上传,需要加上一段逻辑,判断上传的文件大小+网盘中所有文件的大小是否已经大于个人网盘的实际容量,如果大于则给予提示,所以,文件上传的代码修改后如下所示:

[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 = Request.MapPath("~/NetDisk/" + userInfo.UserName);                if (!string.IsNullOrEmpty(filePath))                {                    fileSaveFolder = Path.Combine(fileSaveFolder, filePath);                }                //如果目标不存在,则创建                if (!Directory.Exists(fileSaveFolder))                {                    Directory.CreateDirectory(fileSaveFolder);                }                byte[] buffer = new byte[inputStream.Length];                //判断是否已经超出个人网盘大小                int myDiskSize = _myFileServiceRepository.FindAll(x => x.User.Id == userInfo.Id).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,                    FilePath = "/NetDisk/" + userInfo.UserName + "/" + fileName,                    FileExt = Path.GetExtension(fileSavePath),                    CreateDt = DateTime.Now,                    FileName = fileName,                    FileIcon = GetFileIcon(Path.GetExtension(fileSavePath)),                    User = currentUser                };                //保存数据库                _myFileServiceRepository.Add(myFile);                _myFileServiceRepository.SaveChanges();                string json = new JavaScriptSerializer().Serialize(myFile);                AlertMsg("上传成功", json);            }        }
UploadFile

今天发现一个bug,发现在路径存储的时候,如果文件名中有中文名称,则会出现乱码的问题,这里只能手动进行数据库字段的编码修改了。

下载的代码:

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.FilePath);            //以字符流的形式下载文件            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();        }
                @{int i = 0;}                @foreach (var item in Model)                {                    i++;                                            @item.FileName                        @item.FileSize  字节                        @item.ModifyDt                                                                                                                    下载                                                                                                                        编辑                                                                                                                        删除                                                                                        }            

测试

完善动态创建的上传文件信息

//上传成功后,单击确定,更新刚刚拼接文件信息    function showMsg(msg, callbackInfo) {        if (msg) {            $(".modal-body").html(msg);            //回调信息            $("#hdcallbackInfo").val(callbackInfo);            console.log(callbackInfo);            //为确定按钮注册单击事件,确定后更新拼接在列表上的文件信息            $('#fileListSure').click(function () {                var fileInfo = $("#hdcallbackInfo").val();                console.log(fileInfo);                fileInfo = JSON.parse(fileInfo);                $("#fileDownLoad").attr("href", "/Home/DownLoadFile?fileId=" + fileInfo.Id);                $("#fileName").html('' + fileInfo.FileName + '');            });            $("#myModal").modal("show");        };    };
$("#btnFile").change(function () {        var files = this.files;        for (var i = 0; i < files.length; i++) {            var file = files[i];            console.log(file);            $('     ' + file.name + '' + file.size + ' 字节' + CurentTime() + '  下载    编辑  删除  ').appendTo($('#fileList tbody'));        };        $('#fileForm').submit();    });

删除,这里进行逻辑删除,为以后客户端的开发考虑,如果是客户端进行上传,可以采用md5的比对,如果文件已经存在,则复制一条信息即可,可实现文件的秒传。

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));            }        }

前端代码

@model IEnumerable
@{ ViewBag.Title = "FileList"; Layout = "~/Views/Shared/_Layout.cshtml";}
@{int i = 0;} @foreach (var item in Model) { i++;
}
文件名 大小 修改日期 操作
@item.FileName @item.FileSize 字节 @item.ModifyDt 下载 编辑 删除
FileList.cshtml

总结

完善上传逻辑,并实现文件的下载与逻辑删除,下一步将实现新建文件夹,并合并新建文件夹与上传文件的逻辑。

转载地址:http://ptwda.baihongyu.com/

你可能感兴趣的文章
从非GP到GP
查看>>
云计算助力CDN加速
查看>>
iphone开发之多线程NSThread和NSInvocationOperation
查看>>
MFMailComposeViewController 发邮件
查看>>
velocity 模板解析类
查看>>
HTTP以及HTTPS协议
查看>>
Browser:浏览器版本判断类
查看>>
MyEclipse Servers视窗出现“Could not create the view: An unexpected exception was thrown”错误解决办法...
查看>>
伪类和伪元素
查看>>
jquery
查看>>
Day 3:模块结构和布局
查看>>
PWP+Nginx 集成环境下载
查看>>
【整理】RabbitMQ publish方法中的immediate和mandatory属性
查看>>
JAVA CAS原理深度分析
查看>>
权限模型
查看>>
如何配置 Log4J 只保留最近七天的日志文件
查看>>
Python 类与元类的深度挖掘 II
查看>>
prometheus收集springboot指标
查看>>
global gtags的配置
查看>>
iOS开发 — Quartz 2D知识点应用 (制作了一个Demo,源代码)
查看>>