WEB上传大文件解决方案
众所皆知,web上传大文件,一直是一个痛。上传文件大小限制,页面响应时间超时.这些都是web开发所必须直面的。
本文给出的解决方案是:前端实现数据流分片长传,后面接收完毕后合并文件的思路。下面贴出简易DEMO源码分享:
前端页面:
@{
ViewBag.Title = "Upload";
}
<h2>Upload</h2>
<table class="table table-striped">
<tr>
<td><input type="file" id="file" onchange="selfile()" /></td>
<td><input type="button" value="上传" onclick="uploading()" /></td>
</tr>
<tr>
<td colspan="2">文件信息:<span id="fileMsg"></span></td>
</tr>
<tr>
<td colspan="2">当前进度:<span id="upsize"></span></td>
</tr>
</table>
<script src="~/Scripts/myUploader.js"></script>
<script type="text/javascript">
//guid
var guid = "@Guid.NewGuid()";
var uploader;
function selfile() {
var f = $("#file")[0].files[0];
uploader = new SupperUploader("@Url.Action("RecvUpload")", f, guid, (1024*1024));
$("#fileMsg").text("文件名:" + uploader.fileName + "文件类型:" + uploader.fileType + "文件大小:" + uploader.fileSize + "字节");
}
function uploading() {
uploader.UploadFun(function () {
$("#upsize").text(uploader.upedSize);
})
}
</script>
后端代码,此Demo是基于MVC架构的:
[HttpGet]
public ActionResult Upload() {
return View();
}
[HttpPost]
public ActionResult RecvUpload(){
try
{
string fileName = Request["fname"];
string index = Request["index"];
string guid = Request["guid"];
var file = Request.Files[0];
var ismerge = Request["ismerge"];
string tempDirpath = "~/Content/temp/" + guid + "/";
string savepath = tempDirpath + index + "_" + fileName;
//合并文件
if (bool.Parse(ismerge))
{
//获取所有分割文件
var files = System.IO.Directory.GetFiles(Server.MapPath(tempDirpath));
//文件FILEINFO
var infos = files.Select(x => new FileInfo(x)).ToList().OrderBy(x=>x.LastWriteTime).ToList();
//合并文件流
FileStream mergefs = new FileStream(Server.MapPath("~/Content/temp/" + fileName),FileMode.Append);
BinaryWriter bw = new BinaryWriter(mergefs);
FileStream tempfs = null;
BinaryReader tempbr= null;
infos.ToList().ForEach(f =>
{
tempfs = new FileStream(f.FullName, FileMode.Open);
tempbr = new BinaryReader(tempfs);
bw.Write(tempbr.ReadBytes((int)tempfs.Length));
tempfs.Close();
tempbr.Close();
});
bw.Close();
mergefs.Close();
//删除分块文件
infos.ForEach(f =>{
System.IO.File.Delete(f.FullName);
});
return Json("success");
}
if (!System.IO.Directory.Exists(Server.MapPath(tempDirpath))){
System.IO.Directory.CreateDirectory(Server.MapPath(tempDirpath));
}
using (FileStream fs = new FileStream(Server.MapPath(savepath), FileMode.CreateNew))
{
using (Stream stream = file.InputStream)
{
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, (int)stream.Length);
fs.Write(buffer, 0, buffer.Length);
}
}
return Json("success");
}
catch (Exception e)
{
return Json(e.Message);
}
}
最终效果:
上传文件存储服务器目录: D:\wamp64\www\up6\db\upload\2019\04\19\920144c756af424ca59136be71cf9209
文件上传记录可在数据库中查看:
文件上传完成,没有出现丢包的情况,完全可以直接使用了。
DEMO下载地址:http://blog.ncmem.com/wordpress/2019/08/09/web大文件上传解决方案-2/
WEB上传大文件解决方案的更多相关文章
- web上传大文件(>4G)有什么解决方案?
众所皆知,web上传大文件,一直是一个痛.上传文件大小限制,页面响应时间超时.这些都是web开发所必须直面的. 本文给出的解决方案是:前端实现数据流分片长传,后面接收完毕后合并文件的思路. 实现文件夹 ...
- WEB上传大文件
众所皆知,web上传大文件,一直是一个痛.上传文件大小限制,页面响应时间超时.这些都是web开发所必须直面的. 本文给出的解决方案是:前端实现数据流分片长传,后面接收完毕后合并文件的思路.下面贴出简易 ...
- Web上传大文件的解决方案
需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...
- java上传大文件解决方案
需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在10G内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以10G来进行限制. 第一步: 前端修改 由于项目使用的是BJ ...
- ASP.Net上传大文件解决方案之IIS7.0下的配置
开源的Brettle.Web.NeatUpload.在公司IIS6.0使用正常,但是在Windows 2008 server IIS7上使用不正常.在网上看到一个解决办法但是没有效果 IIS 7 默认 ...
- Web上传超大文件解决方案
文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件.而且支持断点续传. 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场 ...
- asp.net core mvc上传大文件解决方案
默认上传文件大小不超过30M 第一个问题: IIS 10.0 详细错误 - 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求. 服务器上的请求筛选被配置为拒绝该请求 ...
- web上传大文件的配置
1.项目本身的webconfig 在<system.web>字段下 <httpRuntime targetFramework="4.5" requestLeng ...
- vue上传大文件的解决方案
众所皆知,web上传大文件,一直是一个痛.上传文件大小限制,页面响应时间超时.这些都是web开发所必须直面的. 本文给出的解决方案是:前端实现数据流分片长传,后面接收完毕后合并文件的思路. 实现文件夹 ...
随机推荐
- Mysql: Specified key was too long; max key length is 1000 bytes
在使用quartz持久化的时候,笔者使用的mysql,为了以后方便迁移数据,笔者的Mysql默认引擎MyISAM 于是顺理成章的执行了quartz-2.2.3\docs\dbTables\tables ...
- ASCII、Unicode和UTF-8编码的区别;中英文混合截取
ASCII编码是128个字符 中国把汉字编入GB2312,Shift_JIS/Euc-kr各国标准..... Unicode是为了解决各国乱码的,但浪费存储空间 UTF-8编码把一个Unicode字符 ...
- (转找了好久)实现一个2008serve的IIS的虚拟目录(通过网络路径(UNC)的形式,共享在另外一个2008服务器上
目的:实现一个2008serve的IIS的虚拟目录(通过网络路径(UNC)的形式,共享在另外一个2008服务器上) 准备工作 1.共享资源服务器为 ShareServer,IP地址为:192.168. ...
- js 中 的 if使用条件
在javascript中,哪些值能作为if的条件呢 1.布尔变量true/false2.数字非0,非NaN/ (0 或NaN) 见下面的例子,莫以为负数就以为if语句为假了. 复制代码代码如下: va ...
- BZOJ 2733 [HNOI2012]永无乡 - 启发式合并主席树
Description 1: 查询一个集合内的K大值 2: 合并两个集合 Solution 启发式合并主席树板子 Code #include<cstdio> #include<cst ...
- Spring ApplicationContext(五)invokeBeanFactoryPostProcessors
Spring ApplicationContext(六)BeanPostProcessor 产生回顾一下 ApplicationContext 初始化的几个步骤:第一步是刷新环境变量:第二步是刷新 b ...
- jquery纯数字验证
$(document).ready(function(){ //纯数字验证,只让输入数字,比如-号等都不然输入. $('#user-defined').unbind(); $('#user-de ...
- Koko Eating Bananas LT875
Koko loves to eat bananas. There are N piles of bananas, the i-th pile has piles[i] bananas. The g ...
- 微信小程序bug
2017-11-21 微信movable-view有bug,它不能在style里面设置z-index,一旦设置了,不是层间的元素就会有干扰,比如我移动0层的movable-view,但是1层的mova ...
- h5解决移动端上滑卡顿问题
select{ -webkit-overflow-scrolling: touch;/*解决移动端滑动卡顿问题*/ -webkit-transform: translateZ(0px);/*开启GPU ...
上传文件存储服务器目录:
D:\wamp64\www\up6\db\upload\2019\04\19\920144c756af424ca59136be71cf9209
文件上传记录可在数据库中查看:
文件上传完成,没有出现丢包的情况,完全可以直接使用了。