计算机系统应用教程网站

网站首页 > 技术文章 正文

大文件上传技术前后端

btikc 2024-09-18 08:33:50 技术文章 24 ℃ 0 评论

IIS只禁止我们上传大文件,但有时候又必须要上传,那怎么办呢?我们可以采用切片的方式将文件分次上传。首先是前端,前端页要引入jquery,代码如下:

function UploadFile(controlName, fileName, picAppDownAddress)

{

var file = $("#"+picAppDownAddress)[0].files[0];

PostFile(controlName, fileName, file, 0);//controlName是我页面的一个文件控件的ID,fileName是我的保存的文件名,因为我这个文件是通用的。五个控件共用一个方法。

}

//执行分片上传

function PostFile(controlName, fileName, file, i) {

var name = fileName, //文件名

size = file.size, //总大小shardSize = 2 * 1024 * 1024,

shardSize = 2 * 1024 * 1024, //以2MB为一个分片,每个分片的大小

shardCount = Math.ceil(size / shardSize); //总片数

if (i >= shardCount) {

return;

}

//console.log(size,i+1,shardSize); //文件总大小,第一次,分片大小//

var start = i * shardSize;

var end = start + shardSize;

var packet = file.slice(start, end); //将文件进行切片

/* 构建form表单进行提交 */

var form = new FormData();

form.append("file", packet); //slice方法用于切出文件的一部分

form.append("lastModified", file.lastModified); //最后的额修改时间

form.append("name", name);

form.append("totalSize", size);

if (shardCount === i + 1) {

shardSize = size - i * shardSize

}

form.append("GlobalAppType", $("#txtGlobalAppType").val());

form.append("startPosition", start);

form.append("endPosition", end);

form.append("token", token);

form.append("shardSize", shardSize);

form.append("total", shardCount); //总片数

form.append("index", i + 1); //当前是第几片

$.ajax({

url: apihost+"Config/FileResume",

type: "POST",

data: form,

//timeout:"10000", //超时10秒

async: true, //异步

dataType: "json",

processData: false, //很重要,告诉jquery不要对form进行处理

contentType: false, //很重要,指定为false才能形成正确的Content-Type

success: function (msg) {

/* 表示上一块文件上传成功,继续下一次 */

if (msg.CodeID == "201") {

form = '';

i++;

PostFile(controlName, fileName, file, i);

} else if (msg.CodeID == "502") {

form = '';

/* 失败后,每2秒继续传一次分片文件 */

setInterval(function () { PostFile(controlName, fileName, file, i) }, 2000);

} else if (msg.CodeID == "200") {

$("#" + controlName).val(msg.data);

$("#txtUpdateTime").val(getNowFormatDate());

} else if (msg.CodeID == "500") {


} else {

console.log('未知错误');

}

}

})

}

后端代码如下:

/// <summary>

/// 文件续传。

/// </summary>

/// <returns></returns>

public dynamic FileResume()

{

var request = System.Web.HttpContext.Current.Request;

var formData = request.Form;

string GlobalAppType = formData["GlobalAppType"];

string name = formData["name"];

string shardSize = formData["shardSize"];//以2MB为一个分片,每个分片的大小

string totalSize = formData["totalSize"];//文件大小

string total = formData["total"];//总片数

string index = formData["index"];//当前是第几片

string startPosition = formData["startPosition"];//开始位置

string endPosition = formData["endPosition"];//结束位置

string token = formData["token"];

var paramsResult = CheckParams(new string[] { GlobalAppType, name, token });

if (paramsResult.CodeID != "0")

{

return paramsResult;

}

string checktoken = SecurityHelper.GetMD5("123" + ConfigurationManager.AppSettings["appkey"]);

if (token != checktoken)

{

return new { code = "fail", CodeID = "2", msg = "token错误" };

}

try

{

HttpPostedFile file = request.Files["file"];

SaveAs(int.Parse(GlobalAppType), int.Parse(total), int.Parse(index), long.Parse(startPosition), long.Parse(endPosition), HttpContext.Current.Server.MapPath("~/Config/" + GlobalAppType + "/") + name, file.InputStream);

}

catch(Exception ex)

{

return new { code = "fail", CodeID = "500", msg = "", data = "" };

}

string fileurl = AppConfigFileHelper.APIFileHost + "Config/" + GlobalAppType + "/" + name;

if(int.Parse(index)==int.Parse(total))

{

return new { code = "success", CodeID = "200", msg = "", data = fileurl };

}

else

{

return new { code = "success", CodeID = "201", msg = "", data = fileurl };

}

}

/// <summary>

/// 给已有文件追加文件流。

/// </summary>

/// <param name="saveFilePath"></param>

/// <param name="stream"></param>

private void SaveAs(int GlobalAppType,int total,int index,long startPosition,long endPosition,string saveFilePath, System.IO.Stream stream)

{

//接收到的字节信息。

//默认写针位置。

System.IO.FileStream fs;

var savePath = AppDomain.CurrentDomain.BaseDirectory + @"Config\" + GlobalAppType + @"\";

if (!Directory.Exists(savePath))

{

Directory.CreateDirectory(savePath);

}

if (System.IO.File.Exists(saveFilePath)&&index==1)

{

File.Delete(saveFilePath);

}

if (System.IO.File.Exists(saveFilePath))

{

fs = System.IO.File.OpenWrite(saveFilePath);

}

else

{

fs = new System.IO.FileStream(saveFilePath, System.IO.FileMode.Create);

}

fs.Seek(startPosition, System.IO.SeekOrigin.Current);

//向文件追加文件流。

byte[] nbytes = new byte[512];

int nReadSize = 0;

nReadSize = stream.Read(nbytes, 0, 512);

while (nReadSize > 0)

{

fs.Write(nbytes, 0, nReadSize);

nReadSize = stream.Read(nbytes, 0, 512);

}

fs.Close();

}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表