写在前面

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

系列文章

[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. 学习 opencv---(11)OpenC 边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器

    本篇文章中,我们将一起学习OpenCV中边缘检测的各种算子和滤波器——Canny算子,Sobel算子,Laplace算子以及Scharr滤波器.文章中包含了五个浅墨为大家准备的详细注释的博文配套源代码 ...

  2. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) A 水 B stl C stl D 暴力 E 树状数组

    A. Unimodal Array time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  3. angular2 获取到的数据无法实时更新的问题

    在修改完组件数据之后调用下面两句: this.changeDetectorRef.markForCheck(); this.changeDetectorRef.detectChanges(); 注入到 ...

  4. ftp server安装与配置

    http://note.youdao.com/noteshare?id=905513cfcdba7d6a8d2fbdd0874a6259

  5. 新式类 VS 经典类

    一.概述 Python中支持多继承,也就是一个子类可以继承多个父类/基类.当一个调用一个自身没有定义的属性时,它是按照何种顺序去父类中寻找的呢?尤其是当众多父类中都包含有同名的属性,这就涉及到新式类 ...

  6. PowderDesign的使用

    (一)PowderDesign的安装 powderDesign下面简称pd,安装的话在网上找到安装包,安装后破解就行了.打开如图: (二)sql导入 操作步骤:File----------->R ...

  7. jQuery UI基本使用方法

    其实jQuery UI早就在我的学习计划中,只不过因为计划安排始终处于待命状态,最近项目要用到jQuery UI,就提前学习一下,也想能够封装自己的UI库,这样就不用老按照别人的套路走了,像使用jQu ...

  8. Git同时push到多个远程仓库

    添加第二个远程地址时使用以下命令: git remote set-url --add origin git@github.com:morethink/programming.git 查看远程分支:gi ...

  9. .net core 中 identity server 4 之Topic --定义Client

    客户端指能够从id4获取Token的角色. 客户端的共性: a unique client ID a secret if needed the allowed interactions with th ...

  10. Vue.js入门系列教程(一)

    基本的Vue代码结构 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...