package com.java110.core.client;
|
|
import com.java110.utils.util.Base64Convert;
|
import com.java110.utils.util.DateUtil;
|
import org.apache.commons.net.ftp.FTP;
|
import org.apache.commons.net.ftp.FTPClient;
|
import org.apache.commons.net.ftp.FTPFile;
|
import org.apache.commons.net.ftp.FTPReply;
|
import org.slf4j.Logger;
|
import com.java110.core.log.LoggerFactory;
|
import org.springframework.stereotype.Component;
|
import org.springframework.web.multipart.MultipartFile;
|
|
import java.io.*;
|
import java.util.UUID;
|
|
@Component
|
public class FtpUploadTemplate {
|
|
private static Logger logger = LoggerFactory.getLogger(FtpUploadTemplate.class);
|
|
/*
|
* private static String server = "www.datasvisser.cn"; //地址 private static
|
* int port = 41023;//端口号 private static String userName = "jntechFTP1";//登录名
|
* private static String userPassword ="MXUsssMjhssE+*=a3C4\\0";//密码
|
*/
|
private static String ftpPath = "uploadFiles"; // 文件上传目录
|
private static String LOCAL_CHARSET = "GBK";
|
private static String SERVER_CHARSET = "ISO-8859-1";
|
private final static String localpath = "F:/";//下载到F盘下
|
private final static String fileSeparator = System.getProperty("file.separator");
|
private final static String DEFAULT_IMG_SUFFIX = ".jpg";
|
private final static String IMAGE_DEFAULT_PATH = "img/";
|
|
|
public final static String FTP_DOMAIN = "FTP_DOMAIN";
|
public final static String FTP_SERVER = "FTP_SERVER";
|
public final static String FTP_PORT = "FTP_PORT";
|
public final static String FTP_USERNAME = "FTP_USERNAME";
|
public final static String FTP_USERPASSWORD = "FTP_USERPASSWORD";
|
public final static String FTP_PATH = "FTP_PATH";
|
|
|
/*
|
*图片上传工具方法
|
* 默认上传至 img 文件下的当前日期下
|
*/
|
public String upload(String imageBase64, String server, int port,
|
String userName, String userPassword, String ftpPath) {
|
String fileName = "";
|
FTPClient ftpClient = null;
|
ByteArrayInputStream is = null;
|
try {
|
ftpClient = new FTPClient();
|
// request.setCharacterEncoding("utf-8");
|
if (!ftpClient.isConnected()) {
|
ftpClient.connect(server, port);
|
}
|
ftpClient.login(userName, userPassword);
|
ftpClient.enterLocalPassiveMode();
|
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
|
ftpPath = ftpPath + IMAGE_DEFAULT_PATH + DateUtil.getNowII() + "/";
|
mkDir(ftpClient, ftpPath);// 创建目录
|
// 设置上传目录 must
|
ftpClient.changeWorkingDirectory(ftpPath);
|
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
|
LOCAL_CHARSET = "UTF-8";
|
}
|
fileName = UUID.randomUUID().toString();
|
if (imageBase64.contains("data:image/png;base64,")) {
|
imageBase64 = imageBase64.replace("data:image/png;base64,", "");
|
fileName += ".png";
|
} else if (imageBase64.contains("data:image/jpeg;base64,")) {
|
imageBase64 = imageBase64.replace("data:image/jpeg;base64,", "");
|
fileName += ".jpg";
|
} else if (imageBase64.contains("data:image/webp;base64,")) {
|
imageBase64 = imageBase64.replace("data:image/webp;base64,", "");
|
fileName += ".jpg";
|
} else if (imageBase64.contains("data:application/octet-stream;base64,")) {
|
imageBase64 = imageBase64.replace("data:application/octet-stream;base64,", "");
|
fileName += ".jpg";
|
} else {
|
fileName += ".jpg";
|
}
|
FTPFile[] fs = ftpClient.listFiles(fileName);
|
if (fs.length == 0) {
|
System.out.println("this file not exist ftp");
|
} else if (fs.length == 1) {
|
System.out.println("this file exist ftp");
|
ftpClient.deleteFile(fs[0].getName());
|
}
|
byte[] context = Base64Convert.base64ToByte(imageBase64);
|
is = new ByteArrayInputStream(context);
|
boolean saveFlag = ftpClient.storeFile(fileName, is);
|
if (!saveFlag) {
|
throw new IllegalArgumentException("存储文件失败");
|
}
|
} catch (Exception e) {
|
logger.error("上传文件失败", e);
|
throw new IllegalArgumentException("上传文件失败");
|
} finally {
|
try {
|
ftpClient.disconnect();
|
if (is != null) {
|
is.close();
|
}
|
} catch (IOException e) {
|
e.printStackTrace();
|
logger.error("关闭ftpClient 失败", e);
|
}
|
}
|
return IMAGE_DEFAULT_PATH + DateUtil.getNowII() + "/" + fileName;
|
}
|
|
/*
|
*文件上传工具方法
|
*/
|
public String upload(MultipartFile uploadFile, String server, int port,
|
String userName, String userPassword, String ftpPath) {
|
String fileName = "";
|
FTPClient ftpClient = null;
|
try {
|
// request.setCharacterEncoding("utf-8");
|
ftpClient = new FTPClient();
|
if (!ftpClient.isConnected()) {
|
ftpClient.connect(server, port);
|
}
|
ftpClient.login(userName, userPassword);
|
ftpClient.enterLocalPassiveMode();
|
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
|
mkDir(ftpClient, ftpPath);// 创建目录
|
// 设置上传目录 must
|
ftpClient.changeWorkingDirectory(ftpPath);
|
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
|
LOCAL_CHARSET = "UTF-8";
|
}
|
//fileName = new String(uploadFile.getOriginalFilename().getBytes(LOCAL_CHARSET), SERVER_CHARSET);
|
/*fileName = id + "-" + fileName;// 构建上传到服务器上的文件名 20-文件名.后缀*/
|
fileName = UUID.randomUUID().toString() + "." + uploadFile.getOriginalFilename().substring(uploadFile.getOriginalFilename().lastIndexOf(".") + 1);
|
FTPFile[] fs = ftpClient.listFiles(fileName);
|
if (fs.length == 0) {
|
System.out.println("this file not exist ftp");
|
} else if (fs.length == 1) {
|
System.out.println("this file exist ftp");
|
ftpClient.deleteFile(fs[0].getName());
|
}
|
InputStream is = uploadFile.getInputStream();
|
boolean saveFlag = ftpClient.storeFile(fileName, is);
|
is.close();
|
if (!saveFlag) {
|
throw new IllegalArgumentException("存储文件失败");
|
}
|
} catch (Exception e) {
|
logger.error("上传文件失败", e);
|
throw new IllegalArgumentException("上传文件失败");
|
} finally {
|
try {
|
ftpClient.disconnect();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
return fileName;
|
}
|
|
/*
|
*文件上传工具方法
|
*/
|
public String upload(InputStream inputStream, String server, int port,
|
String userName, String userPassword, String fileName) {
|
FTPClient ftpClient = null;
|
String ftpPath = "/";
|
|
if(fileName.contains("/")){
|
ftpPath = fileName.substring(0,fileName.lastIndexOf("/")+1);
|
}
|
|
try {
|
// request.setCharacterEncoding("utf-8");
|
|
ftpClient = new FTPClient();
|
if (!ftpClient.isConnected()) {
|
ftpClient.connect(server, port);
|
}
|
ftpClient.login(userName, userPassword);
|
ftpClient.enterLocalPassiveMode();
|
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
|
mkDir(ftpClient, ftpPath);// 创建目录
|
// 设置上传目录 must
|
ftpClient.changeWorkingDirectory(ftpPath);
|
|
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
|
LOCAL_CHARSET = "UTF-8";
|
}
|
//fileName = new String(uploadFile.getOriginalFilename().getBytes(LOCAL_CHARSET), SERVER_CHARSET);
|
/*fileName = id + "-" + fileName;// 构建上传到服务器上的文件名 20-文件名.后缀*/
|
FTPFile[] fs = ftpClient.listFiles(fileName);
|
if (fs.length == 0) {
|
System.out.println("this file not exist ftp");
|
} else if (fs.length == 1) {
|
System.out.println("this file exist ftp");
|
ftpClient.deleteFile(fs[0].getName());
|
}
|
boolean saveFlag = ftpClient.storeFile("/"+fileName, inputStream);
|
if (!saveFlag) {
|
throw new IllegalArgumentException("存储文件失败");
|
}
|
} catch (Exception e) {
|
logger.error("上传文件失败", e);
|
throw new IllegalArgumentException("上传文件失败");
|
} finally {
|
try {
|
ftpClient.disconnect();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
return fileName;
|
}
|
/*
|
*文件下载工具方法
|
*/
|
public byte[] downFileByte(String remotePath, String fileName, String server, int port, String userName, String userPassword) {
|
byte[] return_arraybyte = null;
|
FTPClient ftpClient = null;
|
try {
|
ftpClient = new FTPClient();
|
if (!ftpClient.isConnected()) {
|
ftpClient.connect(server, port);
|
}
|
ftpClient.login(userName, userPassword);
|
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
|
|
ftpClient.enterLocalPassiveMode();
|
if (ftpClient != null) {
|
String f = new String(
|
(remotePath + fileName).getBytes("GBK"),
|
FTP.DEFAULT_CONTROL_ENCODING);//防止乱码
|
InputStream ins = ftpClient.retrieveFileStream(f);//需使用file.getName获值,若用f会乱码
|
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
|
byte[] buf = new byte[2048];
|
int bufsize = 0;
|
while (ins != null && (bufsize = ins.read(buf, 0, buf.length)) != -1) {
|
byteOut.write(buf, 0, bufsize);
|
}
|
//return_arraybyte = byteOut.toByteArray();
|
ByteArrayInputStream fis = new ByteArrayInputStream(byteOut.toByteArray());
|
byteOut.flush();
|
byteOut.close();
|
byte[] buffer = new byte[fis.available()];
|
int offset = 0;
|
int numRead = 0;
|
while (offset < buffer.length && (numRead = fis.read(buffer, offset, buffer.length - offset)) >= 0) {
|
offset += numRead;
|
}
|
if (offset != buffer.length) {
|
throw new IOException("Could not completely read file ");
|
}
|
fis.close();
|
if (ins != null) {
|
ins.close();
|
}
|
return_arraybyte = buffer;
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
logger.error("从ftp读取文件失败", e);
|
} finally {
|
closeConnect(ftpClient);
|
}
|
return return_arraybyte;
|
}
|
|
public static void main(String[] args) {
|
FtpUploadTemplate ftpUploadTemplate = new FtpUploadTemplate();
|
String img = ftpUploadTemplate.download("/hc/img/20200518/", "ed05abae-2eca-40ff-81a8-b586ff2e6a36.jpg",
|
"118.89.243.11", 617, "hcdemo", "45j74jpWTf7bNhnC");
|
System.out.printf("img=" + img);
|
}
|
|
public String download(String remotePath, String fileName, String server, int port, String userName, String userPassword) {
|
InputStream is = null;
|
ByteArrayOutputStream bos = null;
|
ByteArrayInputStream fis = null;
|
FTPClient ftpClient = new FTPClient();
|
try {
|
if (!ftpClient.isConnected()) {
|
ftpClient.connect(server, port);
|
}
|
ftpClient.login(userName, userPassword);
|
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
|
ftpClient.enterLocalPassiveMode();
|
int reply = ftpClient.getReplyCode();
|
if (!FTPReply.isPositiveCompletion(reply)) {
|
ftpClient.disconnect();
|
}
|
String f = new String(
|
(remotePath + fileName).getBytes("GBK"),
|
FTP.DEFAULT_CONTROL_ENCODING);
|
is = ftpClient.retrieveFileStream(f);// 获取远程ftp上指定文件的InputStream
|
if (null == is) {
|
throw new FileNotFoundException(remotePath);
|
}
|
bos = new ByteArrayOutputStream();
|
int length;
|
byte[] buf = new byte[2048];
|
while (-1 != (length = is.read(buf, 0, buf.length))) {
|
bos.write(buf, 0, length);
|
}
|
fis = new ByteArrayInputStream(
|
bos.toByteArray());
|
bos.flush();
|
byte[] buffer = new byte[fis.available()];
|
int offset = 0;
|
int numRead = 0;
|
while (offset < buffer.length && (numRead = fis.read(buffer, offset, buffer.length - offset)) >= 0) {
|
offset += numRead;
|
}
|
if (offset != buffer.length) {
|
throw new IOException("Could not completely read file ");
|
}
|
return Base64Convert.byteToBase64(buffer);
|
} catch (Exception e) {
|
logger.error("ftp通过文件名称获取远程文件流", e);
|
} finally {
|
if (bos != null) {
|
try {
|
bos.close();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
if (is != null) {
|
try {
|
is.close();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
if (fis != null) {
|
try {
|
fis.close();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
try {
|
closeConnect(ftpClient);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
return null;
|
}
|
|
public void closeConnect(FTPClient ftpClient) {
|
try {
|
ftpClient.disconnect();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
/**
|
* 选择上传的目录,没有创建目录
|
*
|
* @param ftpPath 需要上传、创建的目录
|
* @return
|
*/
|
public static boolean mkDir(FTPClient ftpClient, String ftpPath) {
|
if (!ftpClient.isConnected()) {
|
return false;
|
}
|
try {
|
// 将路径中的斜杠统一
|
char[] chars = ftpPath.toCharArray();
|
StringBuffer sbStr = new StringBuffer(256);
|
for (int i = 0; i < chars.length; i++) {
|
if ('\\' == chars[i]) {
|
sbStr.append('/');
|
} else {
|
sbStr.append(chars[i]);
|
}
|
}
|
ftpPath = sbStr.toString();
|
// System.out.println("ftpPath:" + ftpPath);
|
if (ftpPath.indexOf('/') == -1) {
|
// 只有一层目录
|
ftpClient.makeDirectory(new String(ftpPath.getBytes(), "iso-8859-1"));
|
ftpClient.changeWorkingDirectory(new String(ftpPath.getBytes(), "iso-8859-1"));
|
} else {
|
// 多层目录循环创建
|
String[] paths = ftpPath.split("/");
|
for (int i = 0; i < paths.length; i++) {
|
ftpClient.makeDirectory(new String(paths[i].getBytes(), "iso-8859-1"));
|
ftpClient.changeWorkingDirectory(new String(paths[i].getBytes(), "iso-8859-1"));
|
}
|
}
|
return true;
|
} catch (Exception e) {
|
e.printStackTrace();
|
return false;
|
}
|
}
|
|
|
public InputStream download(String fileName, String server, int port, String userName, String userPassword) {
|
InputStream is = null;
|
ByteArrayOutputStream bos = null;
|
ByteArrayInputStream fis = null;
|
FTPClient ftpClient = new FTPClient();
|
try {
|
if (!ftpClient.isConnected()) {
|
ftpClient.connect(server, port);
|
}
|
ftpClient.login(userName, userPassword);
|
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
|
ftpClient.enterLocalPassiveMode();
|
int reply = ftpClient.getReplyCode();
|
if (!FTPReply.isPositiveCompletion(reply)) {
|
ftpClient.disconnect();
|
}
|
String f = new String(
|
("/"+fileName).getBytes("GBK"),
|
FTP.DEFAULT_CONTROL_ENCODING);
|
is = ftpClient.retrieveFileStream(f);// 获取远程ftp上指定文件的InputStream
|
if (null == is) {
|
throw new FileNotFoundException(fileName);
|
}
|
|
} catch (Exception e) {
|
logger.error("ftp通过文件名称获取远程文件流", e);
|
} finally {
|
try {
|
closeConnect(ftpClient);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
return is;
|
}
|
}
|