最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

JS和WebService大文件上传代码分享

来源:动视网 责编:小采 时间:2020-11-27 20:01:43
文档

JS和WebService大文件上传代码分享

JS和WebService大文件上传代码分享:在编写前端的过程中,难免会遇到文件上传的问题,当用户要上传较大的文件是,会被服务器端,阻止其上传,在ASP.Net中,调整服务器接受文件的大小的配置方法如下: 在ASP中配置Web.config文件的httpRuntime:<httpRuntime execution
推荐度:
导读JS和WebService大文件上传代码分享:在编写前端的过程中,难免会遇到文件上传的问题,当用户要上传较大的文件是,会被服务器端,阻止其上传,在ASP.Net中,调整服务器接受文件的大小的配置方法如下: 在ASP中配置Web.config文件的httpRuntime:<httpRuntime execution


但是,即使把服务器的配置中的上传文件大小写的够大,又会受到IIS的,而且也不能为用户提供安全的服务。那有没有一种方法能解决大文件上传的问题呢?
肯定是有的:分片上传。
分片上传是指将想要上传的文件在前端切割成大小很小的小块,然后再传给服务器,从服务器端再将文件组合成整的文件。
先从前端说起,在分片上传的过程中,前端任务是将文件分片,分片的办法有很多,例如可以使用WebUpLoader提供的上传组件进行分片,也可以用JS与JQ提供的代码进行上传,代码实例如下:

var BYTES_PER_CHUNK = 1024 * 1024; // 每个文件切片大小定为1MB .
var slices;
var totalSlices;

//发送请求
function sendRequest() {
var blob = document.getElementById("yourID").files[0];
var start = 0;
var end;
var index = 0;


// 计算文件切片总数
slices = Math.ceil(blob.size / BYTES_PER_CHUNK);
totalSlices= slices;
while(start < blob.size) {
end = start + BYTES_PER_CHUNK;
if(end > blob.size) {
end = blob.size;
}
uploadFile(blob, index, start, end);
start = end;
index++;
if ( index>=totalSlices )
alert("Complete!!");
}
}

//上传文件
function uploadFile(blob, index, start, end) {
var xhr;
var fd;
var chunk; 
var sliceIndex=blob.name+index;
chunk =blob.slice(start,end);//切割文件

fd = new FormData();
fd.append("FileName", chunk, sliceIndex);
var xhr = new XMLHttpRequest();
xhr.open('POST', 'Server URL', false);//false,同步上传;ture,异步上传
xhr.send(fd);
if((xhr.status >=200 && xhr.status < 300) || xhr.status == 304){
setTimeout("",10);
}else{
uploadFile(blob, index, start, end);
}
}

有了前端,当然少不了在后端的接受与组合,在这里我用ASP.Net为例,说明如何接收与组合文件。

public void RecoveryKPJD()
 {
 HttpContext context = System.Web.HttpContext.Current;
 context.Response.ContentType = "text/plain";
 //如果进行了分片
 if (context.Request.Form.AllKeys.Any(m => m == "chunk"))
 {
 //取得chunk和chunks
 int chunk = Convert.ToInt32(context.Request.Form["chunk"]);//当前分片在上传分片中的顺序(从0开始)
 int chunks = Convert.ToInt32(context.Request.Form["chunks"]);//总分片数
 //根据GUID创建用该GUID命名的临时文件夹
 string folder = Your Path + context.Request["guid"] + "/";
 string path = folder + chunk;


 //建立临时传输文件夹
 if (!Directory.Exists(Path.GetDirectoryName(folder)))
 {
 Directory.CreateDirectory(folder);
 }

 FileStream addFile = new FileStream(path, FileMode.Append, FileAccess.Write);
 BinaryWriter AddWriter = new BinaryWriter(addFile);
 //获得上传的分片数据流
 HttpPostedFile file = context.Request.Files[0];
 Stream stream = file.InputStream;

 BinaryReader TempReader = new BinaryReader(stream);
 //将上传的分片追加到临时文件末尾
 AddWriter.Write(TempReader.ReadBytes((int)stream.Length));
 //关闭BinaryReader文件阅读器
 TempReader.Close();
 stream.Close();
 AddWriter.Close();
 addFile.Close();

 TempReader.Dispose();
 stream.Dispose();
 AddWriter.Dispose();
 addFile.Dispose();
 if (chunk == chunks - 1)
 {
 //合并文件
 ProcessRequest(context.Request["guid"], Path.GetExtension(file.FileName));
 }
 }
 else//没有分片直接保存
 {
 string targetPath = ""; //此处写文件的保存路径
 context.Request.Files[0].SaveAs(targetPath);
 }
 }

 private void ProcessRequest(string guid, string fileExt)
 {
 HttpContext context = System.Web.HttpContext.Current;
 context.Response.ContentType = "text/plain";
 string sourcePath = Path.Combine("Your Path", guid + "/");//源数据文件夹
 string targetPath = Path.Combine("Your Path", Guid.NewGuid() + fileExt);//合并后的文件

 DirectoryInfo dicInfo = new DirectoryInfo(sourcePath);
 if (Directory.Exists(Path.GetDirectoryName(sourcePath)))
 {
 FileInfo[] files = dicInfo.GetFiles();
 foreach (FileInfo file in files.OrderBy(f => int.Parse(f.Name)))
 {
 FileStream addFile = new FileStream(targetPath, FileMode.AppenFileAccess.Write);
 BinaryWriter AddWriter = new BinaryWriter(addFile);

 //获得上传的分片数据流
 Stream stream = file.Open(FileMode.Open);
 BinaryReader TempReader = new BinaryReader(stream);
 //将上传的分片追加到临时文件末尾
 AddWriter.Write(TempReader.ReadBytes((int)stream.Length));
 //关闭BinaryReader文件阅读器
 TempReader.Close();
 stream.Close();
 AddWriter.Close();
 addFile.Close();

 TempReader.Dispose();
 stream.Dispose();
 AddWriter.Dispose();
 addFile.Dispose();
 }
 }
 }

文档

JS和WebService大文件上传代码分享

JS和WebService大文件上传代码分享:在编写前端的过程中,难免会遇到文件上传的问题,当用户要上传较大的文件是,会被服务器端,阻止其上传,在ASP.Net中,调整服务器接受文件的大小的配置方法如下: 在ASP中配置Web.config文件的httpRuntime:<httpRuntime execution
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top