`
buerkai
  • 浏览: 166913 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

serverlet实现文件的下载(迅雷、360)

 
阅读更多
在serverlet中实现如下方法
HttpServletResponse v_resp = ((HttpServletResponse) arg1);
String v_serverName = arg0.getParameter("data");
if (v_serverName != null && !v_serverName.trim().isEmpty()) {
if (true)
{
String v_filename = v_serverName;
try {
String v_path = PlatformManager.getInstance().getBaseDir()
+ "report" + File.separator;
File v_f = new File(v_path + v_filename);
if (!v_f.exists() || v_f.isDirectory()) {
writeLog("获取报表不存在:[" + v_filename + "]",
"");
v_resp.setStatus(404);
return;
}
if (v_f.length() < Integer.MAX_VALUE) {
// 迅雷下载的话必须设置这个参数
v_resp.setContentLength((int) v_f.length());
}
v_resp.setContentType("text/html");
v_resp.setHeader("Content-disposition",
"attachment; filename=" + v_filename);

ServletOutputStream v_out = v_resp.getOutputStream();
FileInputStream v_fis = new FileInputStream(v_f);
int v_temp = 0;
byte[] v_buffer = new byte[10240];
ByteArrayOutputStream v_bos = new ByteArrayOutputStream();
while ((v_temp = v_fis.read(v_buffer)) >= 0) {
v_bos.write(v_buffer, 0, v_temp);
}
v_out.write(v_bos.toByteArray());
v_out.flush();
v_resp.flushBuffer();
v_bos.close();
v_fis.close();
return;
} catch (Exception e) {
writeLog("下载文件异常:[" + v_filename + "],MSG="+e.getMessage(), "");
v_resp.setStatus(404);
return ;
}
}
}

//本段代码关键部分:
v_resp.setContentLength((int) v_f.length());要使用迅雷下载需设置文件大小,这个地方由于传入参数是Int,大概支持2G左右的文件下载。使用360可以不设置此参数。

v_resp.setContentType("text/html");设置文件传输类型,这个参数随便写就是了,只要下面这个参数对了,就可以了。
v_resp.setHeader("Content-disposition",
"attachment; filename=" + v_filename);


当使用360下载工具下载的时候,360有点扯蛋,当你在360浏览器输入你要下载的东西时,还没有等到你点击下载,360就会去请求数据,下载到本地内存中,然后你点击下载,360将内存中的数据写到文件中。这个就是360的杰作。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics