ftp文件下载或上传没数据问题
开发当中遇到了一个通过ftp同步文件的任务,突然遇到了文件上传或下载失败的问题,由于我的文件要求按照字段给定的多目录上传,在网上也查看了很多帖子没有人提到这个问题,以下是我通过实验得出的结论。
ftp这个家伙比较坑,不管是文件上传还是下载都不支持多目录进行,也就是所必须要先进入到文件所在的目录下然后才能执行上传或下载的操作,不然会报错或者是上传下载失败。废话不多说直接上代码
Scala 版本的
import java.io.{File, FileInputStream, FileOutputStream, IOException}
import org.apache.commons.net.ftp.{FTPClient,FTPReply}
object FtpUtils {
var ftp: FTPClient = null
var rootPath:String = null
/**
* 登录到ftp
*/
def ftpLogin(ip: String, port: Int, name: String, pwd: String) = {
ftp = new FTPClient()
ftp.enterLocalPassiveMode()
//验证登录
try {
ftp.connect(ip, port);
ftp.setControlEncoding("UTF-8")
val reply: Int = ftp.getReplyCode
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect()
println("FTP服务器连接失败")
}
rootPath = ftp.printWorkingDirectory()
ftp
} catch {
case e: IOException => e.printStackTrace()
ftp
}
}
/**
* 本地数据上传到ftp
*/
def putFile(file: String, path: String, ftp: FTPClient) = {
var isStore: Boolean = false
try {
changeWorkDir(file, ftp)
// 如果分割符是"\" 这里要用File.separator*2
val filename: String = file.split(File.separator).last
isStore = ftp.storeFile(filename, new FileInputStream(new File(path)))
ftp.changeWorkingDirectory(rootPath)
isStore
} catch {
case e: IOException => e.printStackTrace()
isStore
}
}
/**
* 从ftp 下载数据到本地目录下
*/
def getFile(infile: String, outFile: String, ftp: FTPClient) = {
var isLoad: Boolean = false
try {
ftp.changeWorkingDirectory(rootPath)
changeWorkDir(infile,ftp)
val file: File = new File(outFile)
if(file.getParentFile!=null){
file.getParentFile.getAbsoluteFile.mkdirs()
}
val out: FileOutputStream = new FileOutputStream(outFile)
isLoad = ftp.retrieveFile(infile.split(File.separator).last,out)
ftp.changeWorkingDirectory(rootPath)
isLoad
} catch {
case e: IOException => e.printStackTrace()
isLoad
}
}
/**
* 这里将工作将工作目录移动到最下即的目录
*/
def changeWorkDir(file: String, ftp: FTPClient) = {
val files: Array[String] = file.split(File.separator)
for (i <- 0 until files.length - 1) {
ftp.makeDirectory(files(i))
ftp.changeWorkingDirectory(files(i))
}
}
}
Java版本的
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FtpUtils {
FTPClient ftp = new FTPClient();
String rootPath;
public FTPClient ftpLogin(String ip, int port, String name, String pwd) throws IOException {
ftp.enterLocalPassiveMode();
ftp.connect(ip, port);
ftp.setControlEncoding("UTF-8");
int reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
System.out.println("FTP服务器连接失败");
}
rootPath = ftp.printWorkingDirectory();
return ftp;
}
public Boolean getFile(String infile, String outFile, FTPClient ftp) throws IOException {
ftp.changeWorkingDirectory(rootPath);
changeWorkDir(infile, ftp);
File file = new File(outFile);
if (file.getParentFile() != null) {
file.getParentFile().getAbsoluteFile().mkdirs();
}
FileOutputStream out = new FileOutputStream(outFile);
String[] paths = infile.split(File.separator);
boolean isLoaded = ftp.retrieveFile(paths[paths.length - 1], out);
ftp.changeWorkingDirectory(rootPath);
return isLoaded;
}
public boolean putFile(String file, String path, FTPClient ftp) throws IOException {
changeWorkDir(file, ftp);
// 如果分割符是"\" 这里要两个 File.separator
String[] paths = file.split(File.separator);
String filename = paths[paths.length - 1];
boolean isStored = ftp.storeFile(filename, new FileInputStream(new File(path)));
ftp.changeWorkingDirectory(rootPath);
return isStored;
}
public void changeWorkDir(String file, FTPClient ftp) throws IOException {
String[] paths = file.split(File.separator);
for (String path : paths) {
ftp.makeDirectory(path);
ftp.changeWorkingDirectory(path);
}
}
}