package com.zhph.util;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;
import com.zhph.vo.cases.FileAttachment;
public class FtpUtil {
private static Logger logger = Logger.getLogger(FtpUtil.class.getName ()) ;
private static FTPClient ftp;
public static boolean connectFtpClient() throws Exception{
boolean flag=false;
//ftp服务器登录凭证
String ftpHost=ConfigHelper.getPropertiseValueFromContext("ftpHost");// FTP服务器host
int port=Integer.parseInt(ConfigHelper.getPropertiseValueFromContext("ftpPort"));// FTP服务器端口
String username=ConfigHelper.getPropertiseValueFromContext("ftpUserName");// FTP登录账号
String password=ConfigHelper.getPropertiseValueFromContext("ftpPassword");// FTP登录密码
ftp = new FTPClient();
ftp.setControlEncoding("GBK");
int reply;
ftp.setConnectTimeout(10000);
ftp.connect(ftpHost, port);// 连接FTP服务器
// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
ftp.login(username, password);// 登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
logger.info("FTP server refused connection.");
return flag;
}
//设置PassiveMode传输 设为被动
ftp.enterLocalPassiveMode();
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
flag=true;
return flag;
}
/**
* 关闭ftp连接
*/
public static void closeFtp(){
if (ftp!=null && ftp.isConnected()) {
try {
ftp.logout();
ftp.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* Description: 向FTP服务器上传文件
* @Version 1.0
* @param path FTP服务器保存目录
* @param filename 上传到FTP服务器上的文件名
* @param input 输入流
* @return 成功返回true,否则返回false *
*/
public static boolean uploadFile(
String path, // FTP服务器保存目录
String filename, // 上传到FTP服务器上的文件名
InputStream input // 输入流
){
boolean result = false;
try {
if(connectFtpClient()){
if(!StringHelper.isEmptyString(path)){
String[] paths = path.split("/");
for(int i=0;i<paths.length;i++){
if(!ftp.changeWorkingDirectory(paths[i])){
ftp.makeDirectory(paths[i]);
ftp.changeWorkingDirectory(paths[i]);
}
}
}else{
ftp.makeDirectory(path);
ftp.changeWorkingDirectory(path);
}
if(!ftp.storeFile(filename, input)){
logger.info("无读写权限:"+filename);
return result;
}
input.close();
result = true;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeFtp();
}
return result;
}
/**
* ftp文件下载
* ypg 2017-3-10
* @param request
* @param response
* @param txtFileDir
*/
public static void downFile(HttpServletRequest request, HttpServletResponse response,FileAttachment fileAttachment){
logger.info(new Date()+" 开始进入ftpDownload下载");
try
{
if(connectFtpClient()){
//检索ftp目录下所有的文件,利用时间字符串进行过滤
boolean dir = ftp.changeWorkingDirectory(fileAttachment.getFileAttachmentPath());
if (dir)
{
FTPFile[]fs = ftp.listFiles();
for(FTPFile f:fs)
{
if(f.getName().equals(fileAttachment.getFileAttachmentName()))
{
response.reset();
response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileAttachment.getFileAttachmentTitle().replaceAll(" ", "").getBytes("utf-8"), "iso8859-1"));
response.addHeader("Content-Length", "" + f.getSize());
OutputStream os = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
ftp.retrieveFile(f.getName(),os);
os.flush();
os.close();
logger.info(new Date()+" ftpDownload下载文件成功");
}
}
}
}
}
catch (Exception e)
{
e.printStackTrace();
logger.info(new Date()+" ftpDownload下载文件发生错误");
}
finally
{
closeFtp();
}
}
/**
* ftp文件打包zip下载
* ypg 2017-3-10
* @param request
* @param response
* @param txtFileDir
*/
public static void downZipFile(HttpServletRequest request, HttpServletResponse response,List<FileAttachment> fileAttachments){
logger.info(new Date()+" 开始进入ftpZipDownload下载");
File tempFile =null;
ZipOutputStream out =null;
String directory=Files_Utils_DG.getTempAbsolutePath(request, ConfigHelper.getPropertiseValueFromContext("temp.download.path"));
File fileDirectory=new File(directory);
try
{
tempFile = File.createTempFile(UUID.randomUUID().toString(), ".zip", fileDirectory);
if(connectFtpClient()){
InputStream inputStream;
byte[] buf = new byte[1024];
// Create the ZIP file
// ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipfile));
out = new ZipOutputStream(new FileOutputStream(tempFile));
for(FileAttachment fileAttachment:fileAttachments){
//检索ftp目录下所有的文件,利用时间字符串进行过滤
boolean dir = ftp.changeWorkingDirectory(fileAttachment.getFileAttachmentPath());
if (dir)
{
FTPFile[]fs = ftp.listFiles();
for(FTPFile f:fs)
{
if(f.getName().equals(fileAttachment.getFileAttachmentName()))
{
out.putNextEntry(new ZipEntry(fileAttachment.getFileAttachmentTitle()));
ftp.retrieveFile(f.getName(),out);
out.closeEntry();
logger.info(new Date()+" ftpZipDownload打包文件"+f.getName());
}
}
logger.info(new Date()+" ftpZipDownload下载文件至"+directory);
}
}
response.reset();
// 先去掉文件名称中的空格,然后转换编码格式为utf-8,保证不出现乱码,这个文件名称用于浏览器的下载框中自动显示的文件名
response.addHeader("Content-Disposition", "attachment;filename=" + new String(tempFile.getName().replaceAll(" ", "").getBytes("utf-8"), "iso8859-1"));
response.addHeader("Content-Length", "" + tempFile.length());
response.setContentType("application/octet-stream");
OutputStream os = new BufferedOutputStream(response.getOutputStream());
inputStream = new BufferedInputStream(new FileInputStream(tempFile));
int len;
while ((len = inputStream.read(buf)) > 0) {
os.write(buf, 0, len);
}
os.flush();
//一定要关闭流
os.close();
inputStream.close();
logger.info(new Date()+" ftpZipDownload下载文件成功:"+tempFile.getName());
}
}catch (Exception e)
{
e.printStackTrace();
logger.info(new Date()+" ftpDownload下载文件发生错误");
}
finally
{
closeFtp();
if(out!=null){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
logger.info("删除文件:"+tempFile.delete());
}
}
/**
* ftp文件下载展示
* ypg 2017-3-10
* @param request
* @param response
* @param txtFileDir
*/
public static void downFileDisplay(HttpServletRequest request, HttpServletResponse response,FileAttachment fileAttachment,String contenType){
logger.info(new Date()+" 开始进入ftpDownload下载");
try
{
if(connectFtpClient()){
//检索ftp目录下所有的文件,利用时间字符串进行过滤
boolean dir = ftp.changeWorkingDirectory(fileAttachment.getFileAttachmentPath());
if (dir)
{
FTPFile[]fs = ftp.listFiles();
for(FTPFile f:fs)
{
if(f.getName().equals(fileAttachment.getFileAttachmentName()))
{
response.setHeader("Content-Type",contenType);
OutputStream os = new BufferedOutputStream(response.getOutputStream());
ftp.retrieveFile(f.getName(),os);
os.flush();
os.close();
logger.info(new Date()+" ftpDownload下载文件成功");
}
}
}
}
}
catch (Exception e)
{
e.printStackTrace();
logger.info(new Date()+" ftpDownload下载文件发生错误");
}
finally
{
closeFtp();
}
}
}
ftp上传下载-----打包下载、以流的形式传到前台页面
最新推荐文章于 2025-07-14 13:48:44 发布