写在前面

周末了,在家继续折腾网盘,今天实现网盘文件的上传。

系列文章

[EF]vs15+ef6+mysql code first方式

[实战]MVC5+EF6+MySql企业网盘实战(1)

[实战]MVC5+EF6+MySql企业网盘实战(2)——用户注册

[实战]MVC5+EF6+MySql企业网盘实战(3)——验证码

[实战]MVC5+EF6+MySql企业网盘实战(4)——上传头像

[Bootstrap]modal弹出框

[实战]MVC5+EF6+MySql企业网盘实战(5)——登录界面,头像等比例压缩

[实战]MVC5+EF6+MySql企业网盘实战(5)——页面模板

[实战]MVC5+EF6+MySql企业网盘实战(5)——ajax方式注册

[实战]MVC5+EF6+MySql企业网盘实战(6)——ajax方式登录

业务逻辑

今天突然发现,用户类中少一个个人网盘的默认大小,这里添加一个字段,记录个人网盘的大小,默认给它1G的空间,在数据库中以字节存储。1G=1073741842字节。所以现在用户信息类现在是这个样子。

 /// <summary>
/// 用户信息类
/// </summary>
public class UserInfo
{
/// <summary>
/// 编号
/// </summary>
[Key]
public int Id { set; get; }
/// <summary>
/// 用户头像地址
/// </summary>
[StringLength()]
[Display(Name = "头像")]
public string Header { set; get; }
/// <summary>
/// 姓名
/// </summary>
[MaxLength(, ErrorMessage = "网名长度不得超过32个字符")]
[Required(ErrorMessage = "请填写您的名称")]
[Display(Name = "姓名")]
public string UserName { set; get; }
/// <summary>
/// 密码
/// </summary>
[StringLength(, ErrorMessage = "密码长度不得超多32位")]
[Required]
[Display(Name = "密码")]
public string Pwd { set; get; }
/// <summary>
/// 性别
/// </summary>
[Display(Name = "性别")]
public GenderType Gender { set; get; } /// <summary>
/// 所属部门id
/// </summary>
[Display(Name = "部门")]
public Department Department { set; get; }
/// <summary>
/// 添加时间
/// </summary>
[Display(Name = "创建日期")]
public DateTime CreateDt { set; get; }
/// <summary>
/// 添加时间
/// </summary>
[Display(Name = "登录日期")]
public DateTime LoginDt { set; get; }
/// <summary>
/// 登出时间
/// </summary>
[Display(Name = "登录日期")]
public DateTime LoginOutDt { set; get; }
/// <summary>
/// 网盘默认大小 1G=1073741842字节
/// </summary>
private int _netDiskSize = ; public int NetDiskSize
{
get { return _netDiskSize; }
set { _netDiskSize = value; }
} }

文件信息类MyFile

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Wolfy.NetDisk.Model
{
/// <summary>
/// 我的文件信息
/// </summary>
public class MyFile
{
[Key]
public int Id { set; get; }
[Display(Name = "文件路径")]
[StringLength(int.MaxValue)]
public string FilePath { set; get; }
[Display(Name = "文件名")]
[StringLength()]
public string FileName { set; get; }
[Display(Name = "文件扩展名")]
[StringLength()]
public string FileExt { set; get; }
[Display(Name = "文件图标")]
[StringLength()]
public string FileIcon { set; get; }
[Display(Name = "文件大小")]
public int FileSize { set; get; }
[Display(Name = "文件MD5")]
[StringLength()]
public string FileMd5 { set; get; }
[Display(Name = "文件修改时间")]
public DateTime ModifyDt { set; get; }
[Display(Name = "文件上传时间")]
public DateTime CreateDt { set; get; }
[Display(Name = "文件是否删除")]
public bool IsDelete { set; get; }
[Display(Name = "文件所属")]
public virtual UserInfo User { set; get; }
}
}

其他的IDAL,IBLL,BLL,DAL层的代码与userInfo的基本类似,这里不再贴出。

这里使用iframe进行无刷新上传。

<form action="UploadFile" id="fileForm" method="post" enctype="multipart/form-data" target="fileFrame">
<input type="file" accept="*/*" style="display:none" id="btnFile" name="fileData" />
<input type="hidden" id="hdFilePath" name="filePath" value="" />
<input type="hidden" id="hdcallbackInfo" name="name" value="" />
</form> <iframe style="display:none" name="fileFrame" id="fileFrame"></iframe>

回调js方法

 function showMsg(msg, callbackInfo) {
if (msg) {
$(".modal-body").html(msg);
//回调信息
$("#hdcallbackInfo").val(callbackInfo);
$("#myModal").modal("show");
};
};

服务端

        [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 > )
{
var file = files[];
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];
inputStream.Read(buffer, , 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);
}
}
private void AlertMsg(string msg, string fileJson)
{
Response.ContentType = "text/html";
Response.Write("<script>parent.showMsg('" + msg + "','" + fileJson + "');</script>");
}
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;
}

大概逻辑是,在服务端根据用户名创建一个目录,并且判断是否已经存在该文件,如果个人网盘中有该文件了则对其自动重命名,比如1.txt,则重命名后的名称为1(1).txt,文件及文件夹重命名的方法在之前的文章中写了一个工具类,这里直接拿来使用了。

地址:[工具类]文件或文件夹xx已存在,则重命名为xx(n)(2)

测试:

上传成功后,将信息写入隐藏域中,方便其他地方进行使用。

总结

这里使用了iframe的无刷新上传方式,没有使用插件。考虑到有移动端的访问,一般的上传插件是基于flash的,导致兼容性不是很好。

[实战]MVC5+EF6+MySql企业网盘实战(7)——文件上传的更多相关文章

  1. [实战]MVC5+EF6+MySql企业网盘实战(28)——其他列表

    写在前面 本篇文章将实现,其他文件类型的列表. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) [实战]MVC5+EF ...

  2. [实战]MVC5+EF6+MySql企业网盘实战(27)——应用列表

    写在前面 本篇文章将实现应用列表,同样和其他列表的不同之处,在于查询条件的不同. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘 ...

  3. [实战]MVC5+EF6+MySql企业网盘实战(4)——上传头像

    写在前面 最近又开始忙了,工期紧比较赶,另外明天又要去驾校,只能一个功能一个功能的添加了,也许每次完成的功能确实不算什么,等将功能都实现了,然后在找一个好点的ui对前端重构一下. 系列文章 [EF]v ...

  4. [实战]MVC5+EF6+MySql企业网盘实战(2)——验证码

    写在前面 断断续续,今天算是把验证码的东东弄出来了. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) [实战]MVC5 ...

  5. [实战]MVC5+EF6+MySql企业网盘实战(2)——用户注册

    写在前面 上篇文章简单介绍了项目的结构,这篇文章将实现用户的注册.当然关于漂亮的ui,这在追后再去添加了,先将功能实现.也许代码中有不合适的地方,也只有在之后慢慢去优化了. 系列文章 [EF]vs15 ...

  6. [实战]MVC5+EF6+MySql企业网盘实战(1)

    写在前面 不久前,一个朋友让帮他弄一个单位的企业网盘的管理站点,一直忙,最近抽出了点时间,也想琢磨琢磨mvc,ef,mysql,这算是边琢磨,边实践吧. 系列文章 [实战]MVC5+EF6+MySql ...

  7. [实战]MVC5+EF6+MySql企业网盘实战(26)——音乐列表

    写在前面 本篇文章将实现,音乐列表,同样和其他列表的不同之处,在于查询条件的不同. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网 ...

  8. [实战]MVC5+EF6+MySql企业网盘实战(25)——种子列表

    写在前面 上篇文章实现了视频列表,本篇文章继续实现其他的文件列表.功能相似.这里就不再赘述. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MyS ...

  9. [实战]MVC5+EF6+MySql企业网盘实战(24)——视频列表

    写在前面 上篇文章实现了文档列表,所以实现视频列表就依葫芦画瓢就行了. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) ...

  10. [实战]MVC5+EF6+MySql企业网盘实战(23)——文档列表

    写在前面 上篇文章实现了图片列表,这篇文章实现文档列表将轻车熟路,因为逻辑基本相似,只是查询条件的不同.这里将txt,doc,docx,ppt,pptx,xls,xlsx的文件都归为文档列表中. 系列 ...

随机推荐

  1. vmvare-centos7-vim

    centos7网络连不上问题 http://geekflare.com/no-internet-connection-from-vmware-with-centos-7/ http://www.jia ...

  2. 微信小程序,页面分享

    onShareAppMessage: function () { return { title: '微信小程序联盟', desc: '最具人气的小程序开发联盟!', path: '/page/user ...

  3. OpenCV---色彩空间(二)HSV追踪颜色对象和通道分离与合并

    一:HSV追踪有颜色对象 def inRange(src, lowerb, upperb, dst=None) #lowerb是上面每个颜色分段的最小值,upperb是上面每个颜色分段的最大值,都是列 ...

  4. 周末发福利了!26个免费的HTML5模版

    本期文章我们为大家搜集了很多专业且高质量的HTML5模版,而且还是免费的呦.如果你对编码很熟悉,那么从这些网站里你可以学到很多新技能.来这些国际范的案例中挑选您喜欢的模版学习起来吧:) Zeences ...

  5. LintCode 508: Wiggle Sort

    LintCode 508: Wiggle Sort 题目描述 给你一个没有排序的数组,请将原数组就地重新排列满足如下性质 nums[0] <= nums[1] >= nums[2] < ...

  6. 【POJ】3070 Fibonacci

    [算法]矩阵快速幂 [题解] 根据f[n]=f[n-1]+f[n-2],可以构造递推矩阵: $$\begin{vmatrix}1 & 1\\ 1 & 0\end{vmatrix} \t ...

  7. UIDynamicBehavior的行为类翻译

    CHENYILONG Blog UIDynamicBehavior的行为类翻译 © chenyilong. Powered by Postach.io Blog

  8. jquery 中$符号六大作用

    jquery 中$符号六大作用 2012-12-16 86市场网 javascript a.$用作选择器, var e = $("h1 a"); var f = $("t ...

  9. Java读取大文件的高效率实现

    1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung (http://www.baeldung.com/) 上“Java——回归基础”系列教程的一部分. 2.在内存中读取 ...

  10. 解决ajax chrome禁止本地浏览时加载本地其他文件的方法

    在chrome快捷键右键--属性 “ --allow-file-access-from-files ”,前面用空格隔开.然后应用--确定.