文件上传工具类
文件上传至对应的ftp服务器,并返回一个路径(存储路径)
package com.yang.util;
import org.apache.commons.net.ftp.FTP;
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.*;
/**
* 文件上传工具类
*/
public class FTPUtil {
private static Logger logger = LoggerFactory.getLogger(FTPUtil.class);
/**
* 文件上传
*
* @param host 服务器IP
* @param port 服务器端口
* @param username 服务器用户名
* @param password 服务器密码
* @param path /home/ftpuser/test/年/月/日
* @param fileName 文件名1.jpg
* @param is 文件流
* @return
*/
public static String fileUpload(String host, int port, String username, String password,
String path, String fileName, InputStream is) {
// 判断操作是否正确
boolean flag = false;
// 返回的文件名
String remote = null;
// 创建ftp客户端
FTPClient ftpClient = new FTPClient();
try {
// 设置编码字符集
ftpClient.setControlEncoding("UTF-8");
// 连接FTP服务器
ftpClient.connect(host, port);
// 登录
flag = ftpClient.login(username, password);
if (!flag) {
logger.error("文件服务器用户名或密码错误");
return null;
}
// 获取登录的状态码
int reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
return null;
}
/*****************创建目录 一次只能创建一个目录*****************/
String basePath = "/";
for (String p : path.split("/")) {
basePath += (p + "/");
// 判断目录是否已经存在
boolean hasPath = ftpClient.changeWorkingDirectory(basePath);
if (!hasPath) {
// 创建目录 一次只能创建一个目录,失败的原因都是权限问题
ftpClient.makeDirectory(basePath);
}
}
// 重新指定上传的路径
ftpClient.changeWorkingDirectory(path);
/*******************************************************/
// 指定上传方式为二进制方式
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
// 得到文件后缀
String suffix = fileName.substring(fileName.lastIndexOf("."));
System.out.println("文件后缀为:" + suffix);
remote = UUIDUtil.getUUID() + suffix;
// remote指定上传远程服务器的文件名 local指本地的输入流
flag = ftpClient.storeFile(remote, is);
if (!flag) {
logger.error("文件上传失败,可能是权限,防火墙等问题");
return null;
}
} catch (IOException e) {
logger.error("文件上传错误,错误原因:" + e.getMessage());
} finally {
try {
if(is != null)
is.close();
ftpClient.logout();
if(ftpClient.isConnected())
ftpClient.disconnect();
} catch (IOException e) {
logger.error("文件上传错误,错误原因:" + e.getMessage());
}
}
return remote;
}
public static void main(String[] args) throws FileNotFoundException {
InputStream is = new FileInputStream(new File("D://flower.jpg"));
fileUpload("192.168.10.100", 21, "ftpuser", "123456",
"/home/ftpuser/test/2019/09/10", "flower.jpg", is);
}
}
————————————————————————————————
实战测试
配套的其他工具类
- 时间日期格式转换工具类
package com.yang.utils;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* @see(功能介绍) : 时间日期格式转换工具类
* @version(版本号) : 1.0
* @author(创建人) : Dylan
* @since : JDK 1.8
*/
public class DateUtil {
public static String pattern_date = "yyyy/MM/dd";
public static String getDateStr(LocalDateTime date, String pattern) {
// JDK1.7
//SimpleDateFormat sdf = new SimpleDateFormat(pattern);
//return sdf.format(new Date());
// JDK1.8
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern);
return dtf.format(date);
}
public static void main(String[] args) {
String dateStr = DateUtil.getDateStr(LocalDateTime.now(), DateUtil.pattern_date);
System.out.println(dateStr);
}
}
- 生成UUID工具类
package com.yang.utils;
import java.util.UUID;
/**
* 生成UUID工具类
*/
public class UUIDUtil {
public static String getUUID() {
return UUID.randomUUID().toString().replace("-", "");
}
public static void main(String[] args) {
System.out.println(getUUID());
}
}
开始测试
- controller层
package com.yang.controller;
import com.yang.result.FileResult;
import com.yang.service.FileUploadServiceI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
/**
* 文件上传controller
*/
@Controller
@RequestMapping("/fileUpload")
public class FileUploadController {
@Autowired
private FileUploadServiceI fileUploadService;
/**
* 文件上传
*
* @return
*/
@RequestMapping("/save")
@ResponseBody
public FileResult save(MultipartFile file) {
try {
return fileUploadService.fileUploadSave(file.getOriginalFilename(), file.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
- 接口
package com.yang.service;
import com.yang.result.FileResult;
import java.io.InputStream;
/**
* @see(功能介绍) : 文件上传 Service
* @version(版本号) : 1.0
* @author(创建人) : Dylan
* @since : JDK 1.8
*/
public interface FileUploadServiceI {
/**
* 上传文件至 ftp 服务器
*
* @param fileName 文件名称
* @param inputStream 输入流
* @return
*/
public FileResult fileUploadSave(String fileName, InputStream inputStream);
}
- service 层
package com.yang.service.impl;
import com.yang.result.FileResult;
import com.yang.service.FileUploadServiceI;
import com.yang.utils.DateUtil;
import com.yang.utils.FTPUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.InputStream;
import java.time.LocalDateTime;
/**
* Created by zhi on 2019/9/10.
*/
@Service
public class FileUploadServiceImpl implements FileUploadServiceI {
@Value("192.168.16.10")
private String ftpHost;
@Value("21")
private Integer ftpPort;
@Value("ftpuser")
private String ftpUsername;
@Value("123456")
private String ftpPassword;
@Value("/home/ftpuser/test/")
private String ftpPath;
@Override
public FileResult fileUploadSave(String fileName, InputStream inputStream) {
// 修改文件上传路径,修改为:/home/ftpuser/test/年/月/日
String dateStr = DateUtil.getDateStr(LocalDateTime.now(), DateUtil.pattern_date);
// 最终文件上传路径
String basePath = ftpPath + dateStr;
// 文件上传,返回上传成功的文件名
String result = FTPUtil.fileUpload(ftpHost, ftpPort, ftpUsername, ftpPassword, basePath, fileName, inputStream);
// 判断
FileResult fileResult = new FileResult();
if (null == result || result.length() < 1) {
fileResult.setMessage("文件上传失败");
fileResult.setError("error");
return fileResult;
}
fileResult.setMessage("文件上传成功");
fileResult.setSuccess("success");
// 修改返回的文件地址,修改为:http://192.168.10.100/2019/09/10/939317e3c2084d239a4f21b1684b8df4.jpg
String fileUrl = "http://" + ftpHost + "/" + dateStr + "/" + result;
fileResult.setFileUrl(fileUrl);
return fileResult;
}
}