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();
}
本文暂时没有评论,来添加一个吧(●'◡'●)