之前写过一篇上传文件的博客,大家可以去看看,这篇是接着那一篇的。因为要先把文件传到程序运行的服务器上,再传到ftp服务器上。注:这里只讲代码如何实现,不会讲如何配置ftp服务器。
@RequestMapping(value = "/file",method = RequestMethod.POST)
public void uploadFile(@RequestParam(name = "file") MultipartFile multipartFile)
{
//指定存放上传文件的目录
String fileDir = "C:\\ftpfile\\img3";
File dir = new File(fileDir);
//判断目录是否存在,不存在则创建目录
if (!dir.exists()){
dir.mkdirs();
}
//生成新文件名,防止文件名重复而导致文件覆盖
//1、获取原文件后缀名 .img .jpg ....
String originalFileName = multipartFile.getOriginalFilename();
String suffix = originalFileName.substring(originalFileName.lastIndexOf('.'));
//2、使用UUID生成新文件名
String newFileName = UUID.randomUUID() + suffix;
//生成文件
// C:\ftpfile\img sdasdasd.jpg
File file = new File(dir, newFileName);
//传输内容
try {
multipartFile.transferTo(file);
System.out.println("上传文件成功!");
} catch (IOException e) {
System.out.println("上传文件失败!");
e.printStackTrace();
}
//至此,文件已经传到了程序运行的服务器上。
//下面是这篇博客的重点
//上传至ftp服务器
//1、上传文件
if (uploadToFtp(file)){
System.out.println("上传至ftp服务器!");
}else {
System.out.println("上传至ftp服务器失败!");
}
//2、删除本地文件
file.delete();
}
可以看到核心实现是uploadFtp()这个函数,接下来是函数的内容。
准备:连接ftp服务器需要FTPClient这个类,需要在pom.xml文件中增加依赖
<!-- ftpclient -->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.1</version>
</dependency>
private boolean uploadToFtp(File file){
FTPClient ftpClient = new FTPClient();
try {
//连接ftp服务器 参数填服务器的ip
ftpClient.connect("120.79.137.163");
//进行登录 参数分别为账号 密码
ftpClient.login("ftpuser","123456");
//改变工作目录(按自己需要是否改变)
//只能选择local_root下已存在的目录
ftpClient.changeWorkingDirectory("img");
//设置文件类型为二进制文件
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
//开启被动模式(按自己如何配置的ftp服务器来决定是否开启)
ftpClient.enterLocalPassiveMode();
//上传文件 参数:上传后的文件名,输入流
ftpClient.storeFile(file.getName(), new FileInputStream(file));
System.out.println(file.getName());
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}