最近在做一个FTP文件下载的功能,包括单个文件下载和打包文件下载,但是代码写出来以后经过各种调试测试,发现无论单个文件下载还是打包文件下载,都无法使用迅雷下载,只能使用浏览器进行下载,而且在下载的过程中不会显示进度条,但是文件下载下来的文件是很正常的。
//单个文件下载
public void Ftpdownload(String reaName,String fileName,String remote,HttpServletResponse response,HttpServletRequest request) throws IOException
{
// 开启输出流弹出文件保存路径选择窗口
response.setContentType("application/octet-stream");
response.setContentType("application/OCTET-STREAM;charset=UTF-8");
//解决下载文件中文名称乱码的问题
String agent = request.getHeader("USER-AGENT");
if(agent != null && agent.toLowerCase().indexOf("firefox") > 0)
{
reaName = "=?UTF-8?B?" + (new String(Base64.encodeBase64(reaName.getBytes("UTF-8")))) + "?=";
}
else
{
reaName = java.net.URLEncoder.encode(reaName, "UTF-8");
}
response.setHeader("Content-Disposition", "attachment;filename=" +reaName);
OutputStream out = response.getOutputStream();
// 转移到FTP服务器目录至指定的目录下
ftpClient.changeWorkingDirectory(new String(remote.getBytes(LOCAL_CHARSET), SERVER_CHARSET));
//下载FTP服务器指定文件
ftpClient.retrieveFile(new String(fileName.getBytes(LOCAL_CHARSET), SERVER_CHARSET), out);
out.close();
}
//打包下载
public void download(Map<String,String> map,String isbn,HttpServletResponse response){
// 开启输出流弹出文件保存路径选择窗口
response.setContentType("application/octet-stream");
response.setContentType("application/OCTET-STREAM;charset=UTF-8");
//解决下载文件中文名称乱码的问题
try {
SimpleDateFormat simpleDateFormat;
simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
Date date = new Date();
String folderName=isbn+"-"+simpleDateFormat.format(date);
response.setHeader("Content-Disposition", "attachment;filename=" +URLEncoder.encode(folderName+".zip", "UTF-8"));
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//设置缓存大小
byte[] buffer = new byte[1024];
OutputStream out;
try {
out = response.getOutputStream();
//开启压缩流
ZipOutputStream zipout = new ZipOutputStream(out);
int len;
FTPFile[] listFiles=ftpClient.listFiles();
Set<String> set = map.keySet();
List<InputStream> list = new ArrayList<InputStream>();
for (String key : set) {
// 转移到FTP服务器目录至指定的目录下
ftpClient.changeWorkingDirectory(new String(map.get(key)
.getBytes(LOCAL_CHARSET), SERVER_CHARSET));
String string = new String(key.getBytes(LOCAL_CHARSET),SERVER_CHARSET);
//从FTP服务器下载文件到文件流
InputStream retrieveFileStream = ftpClient
.retrieveFileStream(string);
//标记为压缩包中内的一个新文件
zipout.putNextEntry(new ZipEntry(key));
//写入输出流
while ((len = retrieveFileStream.read(buffer)) > 0) {
zipout.write(buffer, 0, len);
}
//关闭下载流
retrieveFileStream.close();
//FTP内置方法,必须调用才能下载下一个文件流
ftpClient.completePendingCommand();
}
//关闭压缩流
zipout.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}