先将文件命名为.tmp,上传成功后修改名字。
public static boolean uploadImageByCommonFtpSe(File localImage, String imageRelativePath){
if(localImage == null || !localImage.exists()){
log.error("本地文件不存在");
return false;
}else if(imageRelativePath==null || "".equals(imageRelativePath)){
log.fatal("服务器路径为空");
return false;
}else{
//上述代码为从配置文件中获取相关FTP服务器信息
FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect(FTP_SERVER_IP);
boolean loginStatus = ftpClient.login(FTP_SERVER_USER, FTP_SERVER_PASSWORD);
if(loginStatus){
//设置上传的文件类型为图片
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//截取最后一次 "/" 出现的位置, 作为FTP路径
String relativePath = "";
if(imageRelativePath.startsWith("/")){
relativePath = imageRelativePath.substring(1, imageRelativePath.lastIndexOf("/"));
}else{
relativePath = imageRelativePath.substring(0, imageRelativePath.lastIndexOf("/"));
}
//截取最后一次 "/" 出现的位置, 从该位置之后的内容作为文件名
String fileName = imageRelativePath.substring(imageRelativePath.lastIndexOf("/") + 1);
//为了避免文件还没有被传输完成,就被服务器端程序移走,从而造成图片花屏现象,因此,在文件上传时,指定一个临时文件名, 格式为 正式文件名+".tmp"
String fileNameTemp = fileName+".tmp";
//递归建立文件夹
String[] mkds = relativePath.split("/");
String curpath ="";
boolean mkdFlag = false ;
boolean changeDirectoryFlag = false ;
for(int i =0 ;i<mkds.length;i++){
if(mkds[i]!=null && mkds[i]!=""){
mkdFlag = ftpClient.makeDirectory(mkds[i]);
if(mkdFlag){
log.info("目录创建成功!");
}else{
log.info("目录已经存在.");
}
changeDirectoryFlag = ftpClient.changeWorkingDirectory(mkds[i]);
if(changeDirectoryFlag){
log.info("当前目录["+mkds[i]+"].");
}else{
log.error("切换目录失败.");
}
}
}
log.info("开始上传文件["+fileNameTemp+"].");
boolean changeStoreFileFlag = ftpClient.storeFile(fileNameTemp, new FileInputStream(localImage));
if(changeStoreFileFlag){
ftpClient.rename(fileNameTemp, fileName);
log.info("文件["+fileNameTemp+"]重命名为["+fileName+"].");
}else{
log.error("文件上传失败.");
}
boolean logoutFlag = ftpClient.logout();
return true;
}else{
}
} catch (SocketException e1) {
log.error("连接ftp服务器出错",e1);
} catch (IOException e1) {
log.error("连接ftp服务器出错",e1);
}finally{
try {
ftpClient.disconnect();
} catch (IOException e) {
log.error(e);
}
}
return false;
}
}
}