宝哥软件园

jQuery网络上传器上传大文件的片段

编辑:宝哥软件园 来源:互联网 时间:2021-09-12

一般在上传文件时,要上传的文件都是通过客户端上传到服务器的。此时,上传的文件都在服务器内存中。如果上传视频等大文件,服务器内存非常紧张,一般我们使用flash或者html5进行异步上传。如果文件比较大,即使客户端显示文件已经100%上传,仍然会有很长的等待时间,当前页面对服务器的请求会被阻止。

正常情况下,通常是长时间传输完成后直接保存在服务器上。

public void process request(HttpContext上下文){ context。响应。内容类型='文本/纯文本';//保存文件context.request.files [0]。save as(context . server . mappath(' ~/1/' context . request . files[0])。文件名));语境。回应.写(‘你好世界’);}最近项目使用了百度的开源上传组件webuploader,正式介绍webuploader支持片段上传。具体使用方法见http://fex.baidu.com/webuploader/,官网。

varuploader=web uploader . create({ auto : true,swf : '/web uploader/uploader . swf ',//文件接收服务器。Server: '/Uploader.ashx ',//内部是根据当前操作创建的,可能是输入元素,也可能是flash.pick:' # filepicker ',chunked3360 true,//开启切片上传线程: 1,//上传并发数//由于Http的无状态特性,进入当前页面时生成的一个GUID作为标记FormData 3360 { GUID : ' %=GUID . new GUID()。tostring()% ' } });网络上传器的分片上传就是把文件分成几段,然后把数据发布到你定义的文件接收端。如果上传的文件大于碎片的大小,它将被碎片化,然后两个表单元素chunk和chunk将被添加到post的数据中。前者表示当前片段在上传片段中的顺序(从0开始),后者表示片段总数。

选择一个文件后,它被分成七个切片,所以Uploader.ashx已经发布数据七次了。

表单元素包括每个请求中的块和区块,以及片段的GUID,以指示它是同一个文件

服务器收到数据后,可以根据这些参数进行处理。

1.通过按GUID创建临时文件

2.将接收到的片段数据追加到对应于GUID的文件中。

3.根据上传的文件名重命名临时文件

4.如果没有碎片,直接保存

public void process request(HttpContext上下文){ context。响应。内容类型='文本/纯文本';//如果您已经对if(context . request . form . all keys . any(m=m==' chunk ')){//获取chunk和chunk int chunk=convert . toint 32(context . request . form[' chunk ']);整数块=转换。ToInt32(上下文。请求。形成['组块']);//根据GUID,创建一个以GUID命名的临时文件:string path=context . server . mappath(' ~/1/' context . request[' GUID ']);FileStream addFile=新的FileStream(路径,文件模式。追加,文件访问。写);binary writer AddWriter=new binary writer(addFile);//获取上传的分片数据流http postedfile=context . request . files[0];流流=文件。InputStreambinary reader TempReader=new binary reader(流);//将上传的片段追加到临时文件末尾的addwriter . write(tempreader . read bytes((int)stream . length));//关闭BinaryReader文件读取器TempReader。close();小溪。close();AddWriter。close();添加文件。close();TempReader。dispose();小溪。dispose();AddWriter。dispose();添加文件。dispose();//如果是最后一个分片,则在(chunk==(chunk-1)){ file info file info=new file info(路径)的情况下,将临时文件重命名为上传的文件名;文件信息。MoveTo(上下文。Server.MapPath('~/1/'上下文。请求文件[0]。FileName));}} else//保存{context.request.files [0]。save as(context . server . mappath(' ~/1/' context . request . files[0])。filename))而不切片;}上下文。回应。写下(' ok ');}虽然暂时满足了需求,但仍有一些问题没有解决:

1.如果有多个上传并发,会有一个碎片上传服务器没有处理完,第二个碎片会同时到达,所以会出现文件被占用的错误。2.如果第一个问题通过加锁来解决,肯定会影响效率(同时只有一个进程可以访问保存文件的代码)。3.文件的顺序可能是第二个片段先到达,然后第一个片段到达,所以不可能一次追加到临时文件,只能创建多个临时文件,所有片段上传后拼接成一个文件。

这只是一个演示。希望有人能帮忙解决存在的问题。

更多精彩内容,请点击《jQuery上传操作汇总》深入学习研究。

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

更多资讯
游戏推荐
更多+