ftp服务器搭建(windows):
vsftpd简介:
vsftpd是“very secure FTP daemon”的缩写,是一个完全免费的、开放源代码的ftp服务器软件。
下载地址:
http://download.happymmall.com/FTPServer.rar
安装启动步骤:
1.下载解压,点击.exe文件,打开看到如下界面:
2.用户名和密码可以自己随意设置,只要在登录的时候用这个就可以了,共享目录是你要共享出去的你本地的一个目录,上传下载也都在这个里面。
3.打开cmd,输入ipconfig,查看你自己的Ipv4地址
4.在浏览器中输入ftp://你的ip地址,弹出登录框,登录即可看到你的共享目录中的内容。
实现ftp图片上传对接:
1.将ftp服务器需要的配置信息放入properties中,包括ip, user, pwd, 域名前缀。例如:
ftp.server.ip=211.69.197.245
ftp.user=cq
ftp.pass=ftp123
ftp.server.http.prefix=http://img.mall.com/
2.写一个service,上传图片文件到ftp服务器,在这个service中,对path以及文件名做一定的处理,然后具体的上传工作由调用FTPUtil来实现。此时运行后也就需要将ftp服务器开启,才能正确连接并上传。
@Service("iFileService")
public class FileServiceImpl implements IFileService{ private Logger logger = LoggerFactory.getLogger(FileServiceImpl.class); /**
* 上传图片文件到服务器
* @param file 要上传的图片文件
* @param path 上传路径
* @return 上传成功后的文件名返回
*/
public String upload(MultipartFile file, String path) {
//获取原始文件名
String fileName = file.getOriginalFilename();
//获取文件扩展名
//lastIndexOf:返回"."在fileName中最后一个匹配项的索引位置,即abc.jpg会返回.jpg
String fileExtensionName = fileName.substring(fileName.lastIndexOf(".") + 1);
//为了防止不同用户上传图片时,两张图片的文件名完全相同导致覆盖的情况,这里对文件名加上UUID防重复
String uploadFileName = UUID.randomUUID().toString() + "." + fileExtensionName;
//打印日志,通过{}进行占位,也就是一个占位符对应后面的一个数据,类似于c里面的printf("%c",h);
logger.info("开始上传文件,上传文件的文件名:{},上传的路径:{},新文件名:{}", fileName, path, uploadFileName); //创建上传路径目录的文件对象
File fileDir = new File(path);
if(!fileDir.exists()) {
//如果不存在
//赋予这个文件fileDir可写
fileDir.setWritable(true);
//创建文件
//mkdir():当前级别
//mkdirs():如果上传的文件所在的文件是/a,/b,/c等,直接传到服务器上时,这些文件夹都没有,用mkdirs()就可以自动创建
fileDir.mkdirs();
}
File targetFile = new File(path, uploadFileName); try {
file.transferTo(targetFile);
//将targetFile上传到我们的ftp服务器上
FTPUtil.uploadFile(Lists.newArrayList(targetFile));
//已经上 传到ftp服务器上,删除upload下面的文件
targetFile.delete();
} catch (IOException e) {
logger.error("上传文件异常", e);
return null;
}
return targetFile.getName();
} }
3.写一个工具类FTPUtil,专门做图片上传的工作,在这个工具类中,从properties配置文件中拿到ip,user,pwd,在连接到ftp服务器后,用FTPClient做上传工作。
public class FTPUtil { private static final Logger logger = LoggerFactory.getLogger(FTPUtil.class); //根据key拿到value值
private static String ftpIp = PropertiesUtil.getProperty("ftp.server.ip");
private static String ftpUser = PropertiesUtil.getProperty("ftp.user");
private static String ftpPass = PropertiesUtil.getProperty("ftp.pass"); //构造器
public FTPUtil(String ip,int port,String user,String pwd){
this.ip = ip;
this.port = port;
this.user = user;
this.pwd = pwd;
}
//public开放方法
public static boolean uploadFile(List<File> fileList) throws IOException {
FTPUtil ftpUtil = new FTPUtil(ftpIp,21,ftpUser,ftpPass);
logger.info("开始连接ftp服务器");
//remotePath是"img",也就是传到ftp文件夹下面的img这个文件夹下
boolean result = ftpUtil.uploadFile("img",fileList);
logger.info("ftp服务器,结束上传,上传结果:{}", result);
return result;
}
//上传的具体逻辑
//remotePath:远程路径,ftp服务器上的相对路径,上传到ftp服务器上,ftp服务器是一个文件夹,如果需要上传到这个文件夹下的一个文件夹的话,就需要用到remotePath
private boolean uploadFile(String remotePath,List<File> fileList) throws IOException {
boolean uploaded = true;
FileInputStream fis = null;
//连接FTP服务器
if(connectServer(this.ip,this.port,this.user,this.pwd)){
try {
//更改工作目录,将remotePath传入,如果是null,则不需要切换
ftpClient.changeWorkingDirectory(remotePath);
//设置缓冲区
ftpClient.setBufferSize(1024);
//设置encoding编码
ftpClient.setControlEncoding("UTF-8");
//设置文件类型为二进制类型,防止乱码
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//打开本地的ftp的被动模式
ftpClient.enterLocalPassiveMode();
for(File fileItem : fileList){
fis = new FileInputStream(fileItem);
//将文件存入ftpClient
ftpClient.storeFile(fileItem.getName(),fis);
} } catch (IOException e) {
logger.error("上传文件异常",e);
uploaded = false;
e.printStackTrace();
} finally {
//关闭ftpClient
fis.close();
ftpClient.disconnect();
}
}
return uploaded;
}
//连接ftp服务器
private boolean connectServer(String ip,int port,String user,String pwd){ boolean isSuccess = false;
ftpClient = new FTPClient();
try {
//ftp服务器的ip
ftpClient.connect(ip);
//验证ftp服务器用户验证是否通过
isSuccess = ftpClient.login(user,pwd);
} catch (IOException e) {
logger.error("连接FTP服务器异常",e);
}
return isSuccess;
} private String ip;
private int port;
private String user;
private String pwd;
//使用FTPClient上传下载
private FTPClient ftpClient; public String getIp() {
return ip;
} public void setIp(String ip) {
this.ip = ip;
} public int getPort() {
return port;
} public void setPort(int port) {
this.port = port;
} public String getUser() {
return user;
} public void setUser(String user) {
this.user = user;
} public String getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd;
} public FTPClient getFtpClient() {
return ftpClient;
} public void setFtpClient(FTPClient ftpClient) {
this.ftpClient = ftpClient;
}
}
4.提供给controller:
String path = request.getSession().getServletContext().getRealPath("upload");
String targetFileName = iFileService.upload(file, path);
String url = PropertiesUtil.getProperty("ftp.server.http.prefix") + targetFileName;
Map fileMap = Maps.newHashMap();
fileMap.put("uri", targetFileName);
fileMap.put("url", url);
return ServerResponse.createBySuccess(fileMap);
5.在开启ftp服务器后,还需要开启nginx,才能利用nginx反向代理,定位到http://img.mall.com/...