业务场景:
从A服务器通过SFTP将文件下载到应用服务器B,需要将文件从应用服务器B下载到用户本地(文件和应用都在B服务器)
想法:
1. 想要通过FTP连接B服务器下载,但是FTP只能下载到应用所在的本地,也就是只能下载到下载到B服务器,无法下载到用户本地。
2. 通过普通的下载方式,用文件流通过response下载,但是文件夹内有多个文件,无法同时下载
实现:
采用将多个文件打包下载
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//通过工号和日期去获取相应的文件夹路径
String usercode = request.getParameter("usercode");
String date = request.getParameter("date");
String formPath = "/tmp/ENongXian/"+usercode+"/"+date;
//遍历这个路径下的所有文件名
List fileNames = this.getFileName(formPath);
//如果找不到文件 返回not found file
if(fileNames == null||fileNames.size()==0){
PrintWriter out = response.getWriter();
response.setContentType("text/html; charset=GBK");//注意text/html,和application/html
out.print("<html><body><script type='text/javascript'>alert('not found file');</script></body></html>");
out.flush();
out.close();
}else{
//开始批量压缩下载
ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition","attachment; filename="+this.getZipFilename());
System.out.println("in BatchDownload................");
File[] files = new File[fileNames.size()];
for(int i=0;i<files.length;i++){
String filename = fileNames.get(i).toString();
files[i] = new File(formPath+"/"+filename);
}
将文件进行压缩
zipFile(files, "", zos);
zos.flush();
zos.close();
}
}
private void zipFile(File[] subs, String baseName, ZipOutputStream zos) throws IOException {
for (int i=0;i<subs.length;i++) {
File f=subs[i];
zos.putNextEntry(new ZipEntry(baseName + f.getName()));
FileInputStream fis = new FileInputStream(f);
byte[] buffer = new byte[1024];
int r = 0;
while ((r = fis.read(buffer)) != -1) {
zos.write(buffer, 0, r);
}
fis.close();
}
}
private String getZipFilename(){
Date date=new Date();
String s=date.getTime()+".zip";
return s;
}
public List getFileName(String filePath){
File file = new File(filePath);
List fileNameList = new ArrayList();
File[] fileList = file.listFiles();
if(fileList == null || fileList.length ==0){
return null;
}
for(int i=0;i<fileList.length;i++){
if("txt".equals(fileList[i].getName().substring(fileList[i].getName().lastIndexOf(".") + 1))){
continue;
}
if(fileList[i].isFile()){
String fileName = fileList[i].getName();
fileNameList.add(fileName);
}
}
return fileNameList;
}