本文实例为大家分享了Java实现FTP上传与下载的具体代码,供大家参考,具体内容如下
JAVA操作FTP服务器,只需要创建一个FTPClient即可,所有的操作都封装在FTPClient中,JDK自带的有FTPClient(sun.net.ftp.FtpClient),也可以用第三方的FTPClient,一般使用apache的FTPClient(org.apache.commons.net.ftp.FTPClient),本文将使用apache的FTPClient,API都大同小异
关键依赖:commons-net
对常用操作(上传、下载)封装成工具类
package com.day0322;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class FTPUtil {
private static final Logger log = LoggerFactory.getLogger(FTPUtil.class);
private static final int BUFFER_SIZE = 1024 * 1024 * 4;
private static String LOCAL_CHARSET = "GBK";
private static final String CHARSET_UTF8 = "UTF-8";
private static final String OPTS_UTF8 = "OPTS UTF8";
private static final String SERVER_CHARSET = "ISO-8859-1";
private static FTPClient ftpClient = null;
private static void login(OaFtp oaFtp) {
ftpClient = new FTPClient();
try {
ftpClient.connect(oaFtp.getIp(), Integer.valueOf(oaFtp.getPort()));
ftpClient.login(oaFtp.getName(), oaFtp.getPwd());
ftpClient.setBufferSize(BUFFER_SIZE);
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
int reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
closeConnect();
}
} catch (Exception e) {
log.error("",e);
throw new RuntimeException(e);
}
}
private static void closeConnect() {
if (ftpClient != null && ftpClient.isConnected()) {
try {
ftpClient.logout();
ftpClient.disconnect();
} catch (IOException e) {
log.error("",e);
}
}
}
private static String changeEncoding(String ftpPath) {
String directory = null;
try {
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand(OPTS_UTF8, "ON"))) {
LOCAL_CHARSET = CHARSET_UTF8;
}
directory = new String(ftpPath.getBytes(LOCAL_CHARSET), SERVER_CHARSET);
} catch (Exception e) {
log.error("",e);
}
return directory;
}
private static void changeAndMakeWorkingDir(String path) {
try {
ftpClient.changeWorkingDirectory("/");
path = path.replaceAll("\\\\","/");
String[] path_array = path.split("/");
for (String s : path_array) {
boolean b = ftpClient.changeWorkingDirectory(s);
if (!b) {
ftpClient.makeDirectory(s);
ftpClient.changeWorkingDirectory(s);
}
}
} catch (IOException e) {
log.error("",e);
throw new RuntimeException(e);
}
}
public static boolean upload (OaFtp oaFtp, String filename, String dirPath, InputStream in) {
login(oaFtp);
if (!ftpClient.isConnected()) {
return false;
}
boolean isSuccess = false;
if (ftpClient != null) {
try {
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand(OPTS_UTF8, "ON"))) {
LOCAL_CHARSET = CHARSET_UTF8;
}
ftpClient.setControlEncoding(LOCAL_CHARSET);
String path = changeEncoding(dirPath);
changeAndMakeWorkingDir(path);
isSuccess = ftpClient.storeFile(new String(filename.getBytes(), SERVER_CHARSET), in);
} catch (Exception e) {
log.error("",e);
} finally {
closeConnect();
}
}
return isSuccess;
}
public static void download (OaFtp oaFtp, String filename, String dirPath, FileOutputStream out) {
// 登录
login(oaFtp);
if (ftpClient != null) {
try {
String path = changeEncoding(dirPath);
changeAndMakeWorkingDir(path);
String[] fileNames = ftpClient.listNames();
if (fileNames == null || fileNames.length == 0) {
return;
}
for (String fileName : fileNames) {
String ftpName = new String(fileName.getBytes(SERVER_CHARSET), LOCAL_CHARSET);
if (StringUtils.equals(ftpName,filename)) {
InputStream in = ftpClient.retrieveFileStream(fileName);
IOUtils.copy(in,out);
}
}
} catch (IOException e) {
log.error("",e);
} finally {
closeConnect();
}
}
}
}
测试
1.上传
2.下载
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。