众所皆知,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上传大文件的更多相关文章

  1. WEB上传大文件解决方案

    众所皆知,web上传大文件,一直是一个痛.上传文件大小限制,页面响应时间超时.这些都是web开发所必须直面的. 本文给出的解决方案是:前端实现数据流分片长传,后面接收完毕后合并文件的思路.下面贴出简易 ...

  2. web上传大文件(>4G)有什么解决方案?

    众所皆知,web上传大文件,一直是一个痛.上传文件大小限制,页面响应时间超时.这些都是web开发所必须直面的. 本文给出的解决方案是:前端实现数据流分片长传,后面接收完毕后合并文件的思路. 实现文件夹 ...

  3. Web上传大文件的解决方案

    需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...

  4. web上传大文件的配置

    1.项目本身的webconfig  在<system.web>字段下 <httpRuntime targetFramework="4.5" requestLeng ...

  5. vue上传大文件的解决方案

    众所皆知,web上传大文件,一直是一个痛.上传文件大小限制,页面响应时间超时.这些都是web开发所必须直面的. 本文给出的解决方案是:前端实现数据流分片长传,后面接收完毕后合并文件的思路. 实现文件夹 ...

  6. 【Web应用】JAVA网络上传大文件报500错误

    问题描述 当通过 JAVA 网站上传大文件,会报 500 错误. 问题分析 因为 Azure 的 Java 网站都是基于 IIS 转发的,所以我们需要关注 IIS 的文件上传限制以及 requestT ...

  7. [Asp.net]Uploadify上传大文件,Http error 404 解决方案

    引言 之前使用Uploadify做了一个上传图片并预览的功能,今天在项目中,要使用该插件上传大文件.之前弄过上传图片的demo,就使用该demo进行测试.可以查看我的这篇文章:[Asp.net]Upl ...

  8. ASP.NET上传大文件的问题

    原文:http://www.cnblogs.com/wolf-sun/p/3657241.html?utm_source=tuicool&utm_medium=referral 引言 之前使用 ...

  9. QQ上传大文件为什么这么快

    今天和同事在群里讨论“QQ上传大文件/QQ群发送大文件时,可以在极短的时间内完成”是如何做到的. 有时候我们通过QQ上传一个几百M的文件,竟然只用了几秒钟,从带宽上限制可以得出,实际上传文件是不可能的 ...

随机推荐

  1. 20191209 Linux就该这么学(5)

    5. 用户身份与文件权限 5.1 用户的身份和能力 Linux 系统的管理员之所以是 root,并不是因为它的名字叫 root,而是因为该用户的身份号码即 UID( User IDentificati ...

  2. 关于Tomcat配置问题

    一,部署并启动Tomcat服务器 Tomcat: 开源的 Servlet 容器. 解压 apache-tomcat-6.0.16.zip 到一个非中文目录下 配置一个环境变量. java_home(指 ...

  3. 第五周总结&实验·

                                                                  本周总结 1.final声明的变量即成为常量,常量不可以修改. 2.子类能够 ...

  4. poj2407(欧拉函数模板题)

    题目链接:https://vjudge.net/problem/POJ-2407 题意:给出n,求0..n-1中与n互质的数的个数. 思路:欧拉函数板子题,先根据唯一分解定理求出n的所有质因数p1,p ...

  5. python 压缩文件(解决压缩路径问题)

    #压缩文件 def Zip_files(): datapath = filepath # 证据路径 file_newname = datapath + '.zip' # 压缩文件的名字 log.deb ...

  6. hdu2444The Accomodation of Students (最大匹配+判断是否为二分图)

    题意 首先判断所有的人可不可以分成两部分,每部分内的所有人都相互不认识.如果可以分成 则求两部分最多相互认识的对数. 解题 类似分成两组,同组互不相关,就可能使判断是否为二分图 能否分成两部分 则是判 ...

  7. 利用aopc创建schema失败

    执行neo4j-graph-algorithms的例子,运行以下代码报错: CALL apoc.schema.assert( {Category:['name']}, {Business:['id'] ...

  8. [..net core]4.入口,Main方法 及InProcess

    通常控件台程序都有一个main方法, public class Program { public static void Main(string[] args) { CreateWebHostBuil ...

  9. Jade学习(五)之命令编译执行jade

    首先全局安装jade,我们就可以使用jade 命令了! jade index.jade // 解析后会在文件夹中新生成一个压缩代码后的index.html 如果我们不想生成的index.html文件进 ...

  10. QItemDelegate edit某个控件后把数据写回model

    QWidget *TrackDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const ...