今天测试上传文件到 ftp 服务器时,上传不过去。其中遇到了假死问题,已经解决了。
解决以后,就发现在这行代码,一直返回 false 。flag = ftpClient.storeFile(new String(remote.getBytes("UTF-8"),"iso-8859-1"), is);
我查了百度后,各种方法都试过了,都不行,例如:
1.开启这三个
2.设置//调用此方法解决假死状态(设置为被动模式:客户端通知服务端开通一个端口用来数据传输)
ftpClient.enterLocalPassiveMode();
3.设置字符集new String(remote.getBytes("UTF-8"),"iso-8859-1")
4.查看路径权限
都试过了,都不行!!!!已经无语了,百度了好久都是这几种解决办法。难受,有没有大佬帮忙看看!!!!代码如下:public class FTPUtil {
/**
* 文件上传
*
* @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);
//调用此方法解决假死状态(设置为被动模式:客户端通知服务端开通一个端口用来数据传输)
ftpClient.enterLocalPassiveMode();
if (!flag) {
System.out.println("文件服务器用户名或密码错误");
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.makeDirectory(new String(basePath.getBytes("UTF-8"),"iso-8859-1"));
}
}
// 重新指定上传的路径
ftpClient.changeWorkingDirectory(path);
/*******************************************************/
// 指定上传方式为二进制方式
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
// 得到文件后缀
String suffix = fileName.substring(fileName.lastIndexOf("."));
System.out.println("文件后缀为:" + suffix);
remote = UUID.randomUUID() + suffix;
// remote指定上传远程服务器的文件名 local指本地的输入流
//flag = ftpClient.storeFile(remote, is);
flag = ftpClient.storeFile(new String(remote.getBytes("UTF-8"),"iso-8859-1"), is);
System.out.println(flag);
if (!flag) {
System.out.println("文件上传失败,可能是权限,防火墙等问题");
return null; }
} catch (IOException e) {
System.out.println("文件上传错误,错误原因:" + e.getMessage());
} finally {
try {
if(is != null)
is.close();
ftpClient.logout();
if(ftpClient.isConnected())
ftpClient.disconnect();
} catch (IOException e) {
System.out.println("文件上传错误,错误原因:" + e.getMessage());
}
}
return remote;
}
public static void main(String[] args) throws FileNotFoundException {
FileInputStream is = new FileInputStream(new File("D://123.txt"));
fileUpload("182.92.xxx.xxx", 21, "ftpuser", "xxx",
"/home/ftpuser/", "123.txt", is);
}
}
返回结果