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>
SupperUploader是我自己封装的JS插件,源码如下:
var SupperUploader = function (uploadUrl, file, guid, cutSize) {
this.file = file;
//文件大小
this.fileSize = file.size;
//文件类型
this.fileType = file.type;
//文件路径
this.fileName = file.name;
//guid
this.guid = guid;
//分片大小
this.cutSize = cutSize,
//已上传
this.upedSize = 0;
//开始位置
this.startIndex = 0;
//结束位置
this.endIndex = 0;
//序号
this.indexr = 0;
//上传路径
this.uploadUrl = uploadUrl;
//合并结果
this.merged = false;
};
SupperUploader.prototype = {
UploadFun: function (uploadCallBack) {
if (this.merged)
return;
var thisobj = this;
$.ajax({
type: "POST",
url: thisobj.uploadUrl,
enctype: 'multipart/form-data',
data: thisobj.CutFileFun(),
processData: false,
contentType: false,
success: function (res) {
if (res == "success") {
if (thisobj.upedSize == thisobj.fileSize) {
thisobj.merged = true;
alert("已成功上传!")
return;
}
thisobj.upedSize += thisobj.cutSize;
if (thisobj.upedSize > thisobj.fileSize)
thisobj.upedSize = thisobj.fileSize;
thisobj.indexr+=1;
//执行回调函数 uploadCallBack();
//继续调用上传 thisobj.UploadFun(uploadCallBack);
}
}
});
},
CutFileFun: function () {
var formData = null;
if (this.upedSize < this.fileSize) {
this.startIndex = this.upedSize;
this.endIndex = this.startIndex + this.cutSize;
if (this.endIndex > this.fileSize) {
this.endIndex = this.fileSize;
}
var currentData = this.file.slice(this.startIndex, this.endIndex);
formData = new FormData();
formData.append("file", currentData);
formData.append("index", this.indexr);
formData.append("fname", this.fileName);
formData.append("guid", this.guid);
formData.append("ismerge", this.fileSize == this.endIndex);
}
return formData;
}
};
后端代码,此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);
}
}
在此分享!希望多多指正~
后端代码逻辑大部分是相同的,目前能够支持MySQL,Oracle,SQL。在使用前需要配置一下数据库,可以参考我写的这篇文章:http://blog.ncmem.com/wordpress/2019/08/07/java超大文件上传与下载/
WEB上传大文件的更多相关文章
- WEB上传大文件解决方案
众所皆知,web上传大文件,一直是一个痛.上传文件大小限制,页面响应时间超时.这些都是web开发所必须直面的. 本文给出的解决方案是:前端实现数据流分片长传,后面接收完毕后合并文件的思路.下面贴出简易 ...
- web上传大文件(>4G)有什么解决方案?
众所皆知,web上传大文件,一直是一个痛.上传文件大小限制,页面响应时间超时.这些都是web开发所必须直面的. 本文给出的解决方案是:前端实现数据流分片长传,后面接收完毕后合并文件的思路. 实现文件夹 ...
- Web上传大文件的解决方案
需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...
- web上传大文件的配置
1.项目本身的webconfig 在<system.web>字段下 <httpRuntime targetFramework="4.5" requestLeng ...
- vue上传大文件的解决方案
众所皆知,web上传大文件,一直是一个痛.上传文件大小限制,页面响应时间超时.这些都是web开发所必须直面的. 本文给出的解决方案是:前端实现数据流分片长传,后面接收完毕后合并文件的思路. 实现文件夹 ...
- 【Web应用】JAVA网络上传大文件报500错误
问题描述 当通过 JAVA 网站上传大文件,会报 500 错误. 问题分析 因为 Azure 的 Java 网站都是基于 IIS 转发的,所以我们需要关注 IIS 的文件上传限制以及 requestT ...
- [Asp.net]Uploadify上传大文件,Http error 404 解决方案
引言 之前使用Uploadify做了一个上传图片并预览的功能,今天在项目中,要使用该插件上传大文件.之前弄过上传图片的demo,就使用该demo进行测试.可以查看我的这篇文章:[Asp.net]Upl ...
- ASP.NET上传大文件的问题
原文:http://www.cnblogs.com/wolf-sun/p/3657241.html?utm_source=tuicool&utm_medium=referral 引言 之前使用 ...
- QQ上传大文件为什么这么快
今天和同事在群里讨论“QQ上传大文件/QQ群发送大文件时,可以在极短的时间内完成”是如何做到的. 有时候我们通过QQ上传一个几百M的文件,竟然只用了几秒钟,从带宽上限制可以得出,实际上传文件是不可能的 ...
随机推荐
- 【VS开发】win7下让程序默认以管理员身份运行
在win7中用自己写的程序读取MBR时,突然提示无法对磁盘进行操作,而在xp下并没有这个问题:最后点右键以管理员身份运行才可以正常运行.于是想办法让程序在双击启动时默认以管理员身份运行.具体方法: 1 ...
- 使用new关键字创建对象数组(C#,C++,Java)
今天遇到一个题目 分析下面的代码,判断代码是否有误. using System; namespace Test1 { class Point { public int x; public int y; ...
- SAP发布wbservice,如果有权限管控的话,需要给这个webservice加权限
1. PFCG床架角色 2.在角色菜单上,添加其他,选中Authorization Default Values for Services 如下图 3.选中发布的webservice 后保存,如下图: ...
- xml发post请求
# python3字符串换行,在右边加个反斜杠 body = '<?xml version="1.0" encoding = "UTF-8"?>' ...
- App原生、混合、纯WEB开发模式的优劣分析
什么叫做原生App? 什么是混合app? 什么是Web App开发? Native App开发即我们所称的传统APP开发模式(原生APP开发模式),该开发针对IOS.Android等不同的手机操作系统 ...
- 使用MEMCACHED实现缓存
什么是memcached Memcached是一个自由开源的,高性能,分布式内存对象缓存系统. Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fit ...
- 一、Vue CLI
一.Vue CLI https://cli.vuejs.org/zh/guide/installation.html 介绍: 二.安装 # 安装 Vue Cli npm install -g @vue ...
- nginx的高级配置和优化
Nginx的高级配置(优化) 针对内核的配置优化 1)net.core.netdev_max_backlog 表示当网络接口接收数据包的速度大于内核处理这些包块的时候,允许发送到队列的数据包的最大数目 ...
- Codeforces Round #575 (Div. 3) C. Robot Breakout (模拟,实现)
C. Robot Breakout time limit per test3 seconds memory limit per test256 megabytes inputstandard inpu ...
- jmeter之HTTP信息管理器、正则表达式联合使用(获取登录session
如图所示,信息管理头的信息为请求头信息,如图所示 注意事项:1)body date里面的参数要是要注意英文编写条件下,可以通过https://www.json.cn/在线的json格式刷格式 2)注意 ...