日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

js下载文件夹的解决方案

發(fā)布時(shí)間:2023/12/13 综合教程 24 生活家
生活随笔 收集整理的這篇文章主要介紹了 js下载文件夹的解决方案 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

需求:

文件批量上傳,支持?jǐn)帱c(diǎn)續(xù)傳。

文件批量下載,支持?jǐn)帱c(diǎn)續(xù)傳。

使用JS能夠?qū)崿F(xiàn)批量下載,能夠提供接口從指定url中下載文件并保存在本地指定路徑中。

服務(wù)器不需要打包。

支持大文件斷點(diǎn)下載。比如下載10G的文件。

PC端全平臺(tái)支持。Windows,macOS,Linux

全瀏覽器支持。ie6,ie7,ie8,ie9,ie10,ie11,edge,firefox,chrome,safari

這篇文章主要介紹了SpringMVC+Ajax實(shí)現(xiàn)文件批量上傳和下載功能實(shí)例代碼,代碼分為上傳form和上傳ajax,具體實(shí)例代碼大家參考下本文

今天做了文件的上傳下載,小小總結(jié)一下,基本的web項(xiàng)目建立及SpringMVC框架搭建此處不詳細(xì)寫出來(lái)了。

上傳form:

<form id="uploadfiles" enctype="multipart/form-data">

<input type="file" multiple="multiple" id="file_upload" name="file_upload" />

<input type="button" value="上傳" onclick="upload()" />

</form>

上傳Ajax:

<script type="text/javascript">

/*

*上傳文件

*/

function upload(){

var formData = new FormData($( "#uploadfiles" )[0]);

$.ajax({

type: "post",

url: "./path/upload",

dataType: "json",

data: formData,

/**

*必須false才會(huì)自動(dòng)加上正確的Content-Type

*/

contentType : false,

/**

*必須false才會(huì)避開(kāi)jQuery對(duì) formdata 的默認(rèn)處理

* XMLHttpRequest會(huì)對(duì) formdata 進(jìn)行正確的處理

*/

processData : false,

success: function(data){//從后端返回?cái)?shù)據(jù)進(jìn)行處理

if(data){

alert("上傳成功!");

}else{

alert("上傳失敗!");

}

},

error: function(err) {//提交出錯(cuò)

$("#msg").html(JSON.stringify(err));//打出響應(yīng)信息

alert("服務(wù)器無(wú)響應(yīng)");

}

});

}

</script>

上傳文件塊

<%@pagelanguage="java"import="up6.DBFile"pageEncoding="UTF-8"%>

<%@pagecontentType="text/html;charset=UTF-8"%>

<%@pageimport="up6.FileBlockWriter"%>

<%@pageimport="up6.XDebug"%>

<%@pageimport="up6.*"%>

<%@pageimport="up6.biz.*"%>

<%@pageimport="org.apache.commons.fileupload.FileItem"%>

<%@pageimport="org.apache.commons.fileupload.FileItemFactory"%>

<%@pageimport="org.apache.commons.fileupload.FileUploadException"%>

<%@pageimport="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>

<%@pageimport="org.apache.commons.fileupload.servlet.ServletFileUpload"%>

<%@pageimport="org.apache.commons.lang.*"%>

<%@pageimport="java.net.URLDecoder"%>

<%@pageimport="java.util.Iterator"%>

<%@pageimport="net.sf.json.JSONObject"%>

<%@pageimport="java.util.List"%>

<%out.clear();

String uid = request.getHeader("uid");//

String id = request.getHeader("id");

String lenSvr = request.getHeader("lenSvr");

String lenLoc = request.getHeader("lenLoc");

String blockOffset = request.getHeader("blockOffset");

String blockSize = request.getHeader("blockSize");

String blockIndex = request.getHeader("blockIndex");

String blockMd5 = request.getHeader("blockMd5");

String complete = request.getHeader("complete");

String pathSvr ="";

//參數(shù)為空

if(StringUtils.isBlank( uid )

|| StringUtils.isBlank( id )

|| StringUtils.isBlank( blockOffset ))

{

XDebug.Output("param is null");

return;

}

// Check that we have a file upload request

booleanisMultipart = ServletFileUpload.isMultipartContent(request);

FileItemFactory factory =newDiskFileItemFactory();

ServletFileUpload upload =newServletFileUpload(factory);

Listfiles =null;

try

{

files = upload.parseRequest(request);

}

catch(FileUploadException e)

{//解析文件數(shù)據(jù)錯(cuò)誤

out.println("read file data error:"+ e.toString());

return;

}

FileItem rangeFile =null;

//得到所有上傳的文件

IteratorfileItr = files.iterator();

//循環(huán)處理所有文件

while(fileItr.hasNext())

{

//得到當(dāng)前文件

rangeFile = (FileItem) fileItr.next();

if(StringUtils.equals( rangeFile.getFieldName(),"pathSvr"))

{

pathSvr = rangeFile.getString();

pathSvr = PathTool.url_decode(pathSvr);

}

}

booleanverify =false;

String msg ="";

String md5Svr ="";

longblockSizeSvr = rangeFile.getSize();

if(!StringUtils.isBlank(blockMd5))

{

md5Svr = Md5Tool.fileToMD5(rangeFile.getInputStream());

}

verify = Integer.parseInt(blockSize) == blockSizeSvr;

if(!verify)

{

msg ="block size error sizeSvr:"+ blockSizeSvr +"sizeLoc:"+ blockSize;

}

if(verify && !StringUtils.isBlank(blockMd5))

{

verify = md5Svr.equals(blockMd5);

if(!verify) msg ="block md5 error";

}

if(verify)

{

//保存文件塊數(shù)據(jù)

FileBlockWriter res =newFileBlockWriter();

//僅第一塊創(chuàng)建

if( Integer.parseInt(blockIndex)==1) res.CreateFile(pathSvr,Long.parseLong(lenLoc));

res.write( Long.parseLong(blockOffset),pathSvr,rangeFile);

up6_biz_event.file_post_block(id,Integer.parseInt(blockIndex));

JSONObject o =newJSONObject();

o.put("msg","ok");

o.put("md5", md5Svr);

o.put("offset", blockOffset);//基于文件的塊偏移位置

msg = o.toString();

}

rangeFile.delete();

out.write(msg);

%>

下載的jsp頁(yè)面代碼根據(jù)需求不同自己設(shè)計(jì),這里給出jsp代碼:

<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>

<%@pagecontentType="text/html;charset=UTF-8"%>

<%@pageimport="up6.*"%>

<%@pageimport="up6.model.*"%>

<%@pageimport="java.nio.*"%>

<%@pageimport="java.nio.channels.*"%>

<%@pageimport="java.net.URLDecoder"%>

<%@pageimport="java.net.URLEncoder"%>

<%@pageimport="org.apache.commons.lang.*"%>

<%@pageimport="com.google.gson.FieldNamingPolicy"%>

<%@pageimport="com.google.gson.Gson"%>

<%@pageimport="com.google.gson.GsonBuilder"%>

<%@pageimport="com.google.gson.annotations.SerializedName"%>

<%@pageimport="java.io.*"%>

<%out.clear();

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

String fid = request.getHeader("id");

String blockIndex = request.getHeader("blockIndex");//基于1

String blockOffset= request.getHeader("blockOffset");//塊偏移,相對(duì)于整個(gè)文件

String blockSize = request.getHeader("blockSize");//塊大小(當(dāng)前需要下載的大小)

String pathSvr = request.getHeader("pathSvr");//文件在服務(wù)器的位置

pathSvr = PathTool.url_decode(pathSvr);

if( StringUtils.isBlank(fid)

||StringUtils.isBlank(blockIndex)

||StringUtils.isEmpty(blockOffset)

||StringUtils.isBlank(blockSize)

||StringUtils.isBlank(pathSvr))

{

response.setStatus(500);

response.setHeader("err","參數(shù)為空");

return;

}

File f =newFile(pathSvr);

//文件不存在

if(!f.exists())

{

response.setStatus(500);

OutputStream os = response.getOutputStream();

System.out.println(String.format("%s文件不存在",pathSvr));

os.close();

return;

}

longfileLen = f.length();

response.setContentType("application/x-download");

response.setHeader("Pragma","No-cache");

response.setHeader("Cache-Control","no-cache");

response.addHeader("Content-Length",blockSize);

response.setDateHeader("Expires", 0);

OutputStream os = response.getOutputStream();

try

{

RandomAccessFile raf =newRandomAccessFile(pathSvr,"r");

intreadToLen = Integer.parseInt(blockSize);

intreadLen = 0;

raf.seek( Long.parseLong(blockOffset) );//定位索引

byte[] data =newbyte[1048576];

while( readToLen > 0 )

{

readLen = raf.read(data,0,Math.min(1048576,readToLen) );

readToLen -= readLen;

os.write(data, 0, readLen);

}

os.flush();

os.close();

raf.close();

os =null;

response.flushBuffer();

out.clear();

out = pageContext.pushBody();

}

catch(Exception e)

{

response.setStatus(500);

os.close();

out.close();

e.printStackTrace();

}

finally

{

if(os !=null)

{

os.close();

os =null;

}

out.clear();

out = pageContext.pushBody();

}%>

這里我們進(jìn)行了優(yōu)化,下載文件時(shí)將不在服務(wù)器打包。這個(gè)優(yōu)化對(duì)于大型文件的下載來(lái)說(shuō)大幅度提升了效率,而且節(jié)省了服務(wù)器的資源。當(dāng)下載用戶比較多的時(shí)候,服務(wù)器將不會(huì)出現(xiàn)打包多個(gè)文件導(dǎo)致磁盤空間被占滿的情況。

下載頁(yè)面如果用Ajax提交請(qǐng)求的話要注意:ajax函數(shù)的返回類型只有xml、text、json、html等類型,沒(méi)有“流”類型,所以我們要實(shí)現(xiàn)ajax下載,不能夠使用相應(yīng)的ajax函數(shù)進(jìn)行文件下載。但可以用js生成一個(gè)form,用這個(gè)form提交參數(shù),并返回“流”類型的數(shù)據(jù)。

例子:

function download(){

var form=$("<form>");//定義一個(gè)form表單

form.attr("style","display:none");

form.attr("target","");

form.attr("method","post");

form.attr("action","./path/download");//請(qǐng)求url

var input1=$("<input>");

input1.attr("type","hidden");

input1.attr("name","rows");//設(shè)置屬性的名字

input1.attr("value",“test”);//設(shè)置屬性的值

$("body").append(form);//將表單放置在web中

form.append(input1);

form.submit();//表單提交

}

總結(jié)

以上所述是小編給大家介紹的SpringMVC+Ajax實(shí)現(xiàn)文件批量上傳和下載功能實(shí)例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。

批量上傳效果:

批量下載效果

網(wǎng)上例子:http://blog.ncmem.com/wordpress/2019/08/28/java批量下載/

總結(jié)

以上是生活随笔為你收集整理的js下载文件夹的解决方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。