JAVA 实现FTP上传下载(sun.net.ftp.FtpClient) |
您所在的位置:网站首页 › putfile函数如果上传被存在的文件 › JAVA 实现FTP上传下载(sun.net.ftp.FtpClient) |
package com.why.ftp;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
/**
* ftp上传,下载
* @author why 2009-07-30
*
*/
public class FtpUtil {
private String ip = "";
private String username = "";
private String password = "";
private int port = -1;
private String path = "";
FtpClient ftpClient = null;
OutputStream os = null;
FileInputStream is = null;
public FtpUtil(String serverIP, String username, String password) {
this.ip = serverIP;
this.username = username;
this.password = password;
}
public FtpUtil(String serverIP, int port, String username, String password) {
this.ip = serverIP;
this.username = username;
this.password = password;
this.port = port;
}
/**
* 连接ftp服务器
*
* @throws IOException
*/
public boolean connectServer(){
ftpClient = new FtpClient();
try {
if(this.port != -1){
ftpClient.openServer(this.ip,this.port);
}else{
ftpClient.openServer(this.ip);
}
ftpClient.login(this.username, this.password);
if (this.path.length() != 0){
ftpClient.cd(this.path);// path是ftp服务下主目录的子目录
}
ftpClient.binary();// 用2进制上传、下载
System.out.println("已登录到\"" + ftpClient.pwd() + "\"目录");
return true;
}catch (IOException e){
e.printStackTrace();
return false;
}
}
/**
* 断开与ftp服务器连接
*
* @throws IOException
*/
public boolean closeServer(){
try{
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
if (ftpClient != null) {
ftpClient.closeServer();
}
System.out.println("已从服务器断开");
return true;
}catch(IOException e){
e.printStackTrace();
return false;
}
}
/**
* 检查文件夹在当前目录下是否存在
* @param dir
* @return
*/
private boolean isDirExist(String dir){
String pwd = "";
try {
pwd = ftpClient.pwd();
ftpClient.cd(dir);
ftpClient.cd(pwd);
}catch(Exception e){
return false;
}
return true;
}
/**
* 在当前目录下创建文件夹
* @param dir
* @return
* @throws Exception
*/
private boolean createDir(String dir){
try{
ftpClient.ascii();
StringTokenizer s = new StringTokenizer(dir, "/"); //sign
s.countTokens();
String pathName = ftpClient.pwd();
while(s.hasMoreElements()){
pathName = pathName + "/" + (String) s.nextElement();
try {
ftpClient.sendServer("MKD " + pathName + "\r\n");
} catch (Exception e) {
e = null;
return false;
}
ftpClient.readServerResponse();
}
ftpClient.binary();
return true;
}catch (IOException e1){
e1.printStackTrace();
return false;
}
}
/**
* ftp上传
* 如果服务器段已存在名为filename的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换
*
* @param filename 要上传的文件(或文件夹)名
* @return
* @throws Exception
*/
public boolean upload(String filename){
String newname = "";
if(filename.indexOf("/") > -1){
newname = filename.substring(filename.lastIndexOf("/") + 1);
}else{
newname = filename;
}
return upload(filename, newname);
}
/**
* ftp上传
* 如果服务器段已存在名为newName的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换
*
* @param fileName 要上传的文件(或文件夹)名
* @param newName 服务器段要生成的文件(或文件夹)名
* @return
*/
public boolean upload(String fileName, String newName){
try{
String savefilename = new String(fileName.getBytes("ISO-8859-1"), "GBK");
File file_in = new File(savefilename);//打开本地待长传的文件
if(!file_in.exists()){
throw new Exception("此文件或文件夹[" + file_in.getName() + "]有误或不存在!");
}
if(file_in.isDirectory()){
upload(file_in.getPath(),newName,ftpClient.pwd());
}else{
uploadFile(file_in.getPath(),newName);
}
if(is != null){
is.close();
}
if(os != null){
os.close();
}
return true;
}catch(Exception e){
e.printStackTrace();
System.err.println("Exception e in Ftp upload(): " + e.toString());
return false;
}finally{
try{
if(is != null){
is.close();
}
if(os != null){
os.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
/**
* 真正用于上传的方法
* @param fileName
* @param newName
* @param path
* @throws Exception
*/
private void upload(String fileName, String newName,String path) throws Exception{
String savefilename = new String(fileName.getBytes("ISO-8859-1"), "GBK");
File file_in = new File(savefilename);//打开本地待长传的文件
if(!file_in.exists()){
throw new Exception("此文件或文件夹[" + file_in.getName() + "]有误或不存在!");
}
if(file_in.isDirectory()){
if(!isDirExist(newName)){
createDir(newName);
}
ftpClient.cd(newName);
File sourceFile[] = file_in.listFiles();
for(int i = 0; i < sourceFile.length; i++){
if(!sourceFile[i].exists()){
continue;
}
if(sourceFile[i].isDirectory()){
this.upload(sourceFile[i].getPath(),sourceFile[i].getName(),path+"/"+newName);
}else{
this.uploadFile(sourceFile[i].getPath(),sourceFile[i].getName());
}
}
}else{
uploadFile(file_in.getPath(),newName);
}
ftpClient.cd(path);
}
/**
* upload 上传文件
*
* @param filename 要上传的文件名
* @param newname 上传后的新文件名
* @return -1 文件不存在 >=0 成功上传,返回文件的大小
* @throws Exception
*/
public long uploadFile(String filename, String newname) throws Exception{
long result = 0;
TelnetOutputStream os = null;
FileInputStream is = null;
try {
java.io.File file_in = new java.io.File(filename);
if(!file_in.exists())
return -1;
os = ftpClient.put(newname);
result = file_in.length();
is = new FileInputStream(file_in);
byte[] bytes = new byte[1024];
int c;
while((c = is.read(bytes)) != -1){
os.write(bytes, 0, c);
}
}finally{
if(is != null){
is.close();
}
if(os != null){
os.close();
}
}
return result;
}
/**
* 从ftp下载文件到本地
*
* @param filename 服务器上的文件名
* @param newfilename 本地生成的文件名
* @return
* @throws Exception
*/
public long downloadFile(String filename, String newfilename){
long result = 0;
TelnetInputStream is = null;
FileOutputStream os = null;
try{
is = ftpClient.get(filename);
java.io.File outfile = new java.io.File(newfilename);
os = new FileOutputStream(outfile);
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
result = result + c;
}
}catch (IOException e){
e.printStackTrace();
}finally{
try {
if(is != null){
is.close();
}
if(os != null){
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
/**
* 取得相对于当前连接目录的某个目录下所有文件列表
*
* @param path
* @return
*/
public List getFileList(String path){
List list = new ArrayList();
DataInputStream dis;
try {
dis = new DataInputStream(ftpClient.nameList(this.path + path));
String filename = "";
while((filename = dis.readLine()) != null){
list.add(filename);
}
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
public static void main(String[] args){
FtpUtil ftp = new FtpUtil("133.224.202.2","tstbill","tstbill");
ftp.connectServer();
boolean result = ftp.upload("C:/test_why", "test_why/test");
System.out.println(result?"上传成功!":"上传失败!");
List list = ftp.getFileList("test_why/test");
for(int i=0;i ftpClient.setBinaryType();
ftpClient.put(remotefilename);--->ftpClient.putFileStream(remotefilename, true); 等。
如果这样的话,解决这个问题有2个办法: 1. 重写这个上传功能, 但是1.6版本怎么办呢, 可能需要根据jdk版本进行分开处理
2. 在 既存的服务器上,构筑1.6的环境,然后 tomcat 启动的时候,加载1.6的jdk。 这个在linux或者windows上都非常方便。 如果windowss上,tomcat是以服务形式启动的话,直接修改,关联的java 虚拟机源就可以了。
1.package com.boonya.upload.util.simple; 2. 3.import java.io.File; 4.import java.io.FileInputStream; 5.import java.io.FileOutputStream; 6.import java.io.IOException; 7.import java.net.InetSocketAddress; 8.import sun.net.TelnetInputStream; 9.import sun.net.TelnetOutputStream; 10.import sun.net.ftp.FtpClient; 11.import sun.net.ftp.FtpProtocolException; 12./** 13. * Java自带的API对FTP的操作 14. * @Jdk:version 1.7 15. * @Title:Ftp.java 16. * @author: boonya 17. * @notice: 貌似此方法有个缺陷,不能操作大文件 18. */ 19.public class FtpJdk 20.{ 21. /** 22. * 23. * 本地文件名 24. */ 25. private String localfilename; 26. /** 27. * 28. * 远程文件名 29. */ 30. private String remotefilename; 31. /** 32. * 33. * FTP客户端 34. */ 35. private FtpClient ftpClient; 36. 37. /** 38. * 服务器连接 39. * 40. * @param ip 41. * 服务器IP 42. * @param port 43. * 服务器端口 44. * @param user 45. * 用户名 46. * @param password 47. * 密码 48. * @param path 49. * 服务器路径 50. * @throws FtpProtocolException 51. * 52. */ 53. public void connectServer(String ip, int port, String user, String password, String path) throws FtpProtocolException 54. { 55. try 56. { 57. /* ******连接服务器的两种方法****** */ 58. // 第一种方法 59. /* 60. * ftpClient =FtpClient.create(); 61. * ftpClient.connect(new InetSocketAddress(ip, port)); 62. */ 63. // 第二种方法 64. ftpClient = FtpClient.create(ip); 65. ftpClient.login(user, null, password); 66. // 设置成2进制传输 67. ftpClient.setBinaryType(); 68. System.out.println("login success!"); 69. 70. if (path.length() != 0) 71. { 72. // 把远程系统上的目录切换到参数path所指定的目录 73. ftpClient.changeDirectory(path); 74. } 75. ftpClient.setBinaryType(); 76. } catch (IOException ex) 77. { 78. ex.printStackTrace(); 79. throw new RuntimeException(ex); 80. } 81. 82. } 83. 84. /** 85. * 关闭连接 86. * 87. */ 88. 89. public void closeConnect() 90. { 91. try 92. { 93. ftpClient.close(); 94. System.out.println("disconnect success"); 95. } catch (IOException ex) 96. { 97. System.out.println("not disconnect"); 98. ex.printStackTrace(); 99. throw new RuntimeException(ex); 100. } 101. } 102. 103. /** 104. * 105. * 上传文件 106. * 107. * @param localFile 108. * 本地文件 109. * @param remoteFile 110. * 远程文件 111. * @throws FtpProtocolException 112. */ 113. public void upload(String localFile, String remoteFile) throws FtpProtocolException 114. { 115. this.localfilename = localFile; 116. this.remotefilename = remoteFile; 117. TelnetOutputStream os = null; 118. FileInputStream is = null; 119. try 120. { 121. // 将远程文件加入输出流中 122. os = (TelnetOutputStream) ftpClient.putFileStream(this.remotefilename, true); 123. 124. // 获取本地文件的输入流 125. File file_in = new File(this.localfilename); 126. is = new FileInputStream(file_in); 127. 128. // 创建一个缓冲区 129. byte[] bytes = new byte[1024]; 130. int c; 131. while ((c = is.read(bytes)) != -1) 132. { 133. os.write(bytes, 0, c); 134. } 135. System.out.println("upload success"); 136. } catch (IOException ex) 137. { 138. System.out.println("not upload"); 139. ex.printStackTrace(); 140. throw new RuntimeException(ex); 141. } finally 142. { 143. try 144. { 145. if (is != null) 146. { 147. is.close(); 148. } 149. } catch (IOException e) 150. { 151. e.printStackTrace(); 152. } finally 153. { 154. try 155. { 156. if (os != null) 157. { 158. os.close(); 159. } 160. } catch (IOException e) 161. { 162. e.printStackTrace(); 163. } 164. } 165. } 166. } 167. 168. /** 169. * 170. * 下载文件 171. * 172. * @param remoteFile 173. * 远程文件路径(服务器端) 174. * @param localFile 175. * 本地文件路径(客户端) 176. * @throws FtpProtocolException 177. * 178. */ 179. public void download(String remoteFile, String localFile) throws FtpProtocolException 180. { 181. TelnetInputStream is = null; 182. FileOutputStream os = null; 183. try 184. { 185. 186. // 获取远程机器上的文件filename,借助TelnetInputStream把该文件传送到本地。 187. is = (TelnetInputStream) ftpClient.getFileStream(remoteFile); 188. File file_in = new File(localFile); 189. os = new FileOutputStream(file_in); 190. 191. byte[] bytes = new byte[1024]; 192. int c; 193. while ((c = is.read(bytes)) != -1) 194. { 195. os.write(bytes, 0, c); 196. } 197. System.out.println("download success"); 198. } catch (IOException ex) 199. { 200. System.out.println("not download"); 201. ex.printStackTrace(); 202. throw new RuntimeException(ex); 203. } finally 204. { 205. try 206. { 207. if (is != null) 208. { 209. is.close(); 210. } 211. } catch (IOException e) 212. { 213. e.printStackTrace(); 214. } finally 215. { 216. try 217. { 218. if (os != null) 219. { 220. os.close(); 221. } 222. } catch (IOException e) 223. { 224. e.printStackTrace(); 225. } 226. } 227. } 228. } 229. 230. /** 231. * 函数入口 232. * 233. * @param agrs 234. */ 235. public static void main(String agrs[]) 236. { 237. 238. String filepath[] = 239. { "/temp/aa.txt", "/temp/regist.log" }; 240. String localfilepath[] = 241. { "C:\\tmp\\1.txt", "C:\\tmp\\2.log" }; 242. FtpJdk ftp = new FtpJdk(); 243. /* 244. * 使用默认的端口号、用户名、密码以及根目录连接FTP服务器 245. */ 246. try 247. { 248. ftp.connectServer("127.0.0.1", 22, "boonya", "user@", "/temp"); 249. } catch (FtpProtocolException e) 250. { 251. e.printStackTrace(); 252. } 253. // 下载 254. for (int i = 0; i < filepath.length; i++) 255. { 256. try 257. { 258. ftp.download(filepath[i], localfilepath[i]); 259. } catch (FtpProtocolException e) 260. { 261. e.printStackTrace(); 262. } 263. } 264. String localfile = "E:\\contact.txt"; 265. String remotefile = "/temp/records.txt"; 266. // 上传 267. try 268. { 269. ftp.upload(localfile, remotefile); 270. } catch (FtpProtocolException e) 271. { 272. e.printStackTrace(); 273. } 274. ftp.closeConnect(); 275. } 276. 277.}
Java实现FTP上传下载文件的工具包有很多,这里我采用Java自带的API,实现FTP上传下载文件。另外JDK1.7以前的版本与其之后版本的API有了较大的改变了。 例如: JDK1.7之前 JDK1.7 ftpClient = new FtpClinet() ftpClient = FtpClient.create(ip) ftpclient.login(user,password) ftpclient.login(user,null,password) ftpclient.binary() ftpClient.setBinaryType();一. 连接FTP服务器 1: public class FTPUtil { 2: //FTP服务器IP地址 3: public final static String FTP_HOST = "10.103.240.255"; 4: 5: //FTP服务器端口 6: public final static int FTP_PORT = 21; 7: 8: //FTP服务器用户名 9: public final static String FTP_USER = "bloodHunter"; 10: 11: //密码 12: public final static String FTP_PASSWORD = "wbljy"; 13: 14: 15: public static FtpClient getConnect() 16: { 17: try { 18: FtpClient ftpClient = FtpClient.create(FTP_HOST); 19: ftpClient.login(FTP_USER, FTP_PASSWORD.toCharArray()); 20: return ftpClient; 21: } catch (FtpProtocolException e) { 22: // TODO Auto-generated catch block 23: e.printStackTrace(); 24: System.out.println("Connect to FTP Server fail!"); 25: return null; 26: } catch (IOException e) { 27: // TODO Auto-generated catch block 28: e.printStackTrace(); 29: System.out.println("Connect to FTP Server fail!"); 30: return null; 31: } 32: 33: } 34: }二. 上传文件 1: /* 2: * ftp file upload 3: * @param path 上传文件的路径 4: * @param fileName 上传文件名称 5: * @return 上传成功返回true,否则返回false 6: * */ 7: 8: public static boolean FtpUpload(String path,String fileName) 9: { 10: TelnetOutputStream os = null; 11: FileInputStream is = null; 12: FtpClient ftpClient = getConnect(); 13: try { 14: ftpClient.setBinaryType(); 15: os = (TelnetOutputStream) ftpClient.putFileStream(fileName, true); 16: is = new FileInputStream(new File(path)); 17: byte[] buffer = new byte[1024]; 18: int c; 19: while((c = is.read(buffer)) != -1) 20: { 21: os.write(buffer,0,c); 22: } 23: System.out.println("Upload Success!"); 24: return true; 25: } catch (Exception e) { 26: // TODO: handle exception 27: e.printStackTrace(); 28: System.out.println("Upload fail!"); 29: return false; 30: }finally{ 31: try { 32: ftpClient.close(); 33: is.close(); 34: os.close(); 35: } catch (IOException e) { 36: // TODO Auto-generated catch block 37: e.printStackTrace(); 38: } 39: } 40: }三. 下载文件 1: /* 2: * ftp file download 3: * @param path 下载文件的保存路径 4: * @param fileName 下载文件名称 5: * @return 下载成功返回true,否则返回false 6: * */ 7: public static boolean FtpDownload(String path,String fileName) 8: { 9: FileInputStream is = null; 10: FileOutputStream os = null; 11: FtpClient ftpClient = getConnect(); 12: try { 13: is = (FileInputStream) ftpClient.getFileStream(fileName); 14: os = new FileOutputStream(new File(path)); 15: byte[] buffer = new byte[1024]; 16: int c; 17: while((c = is.read(buffer)) != -1) 18: { 19: os.write(buffer,0,c); 20: } 21: System.out.println("Download Success!"); 22: return true; 23: } catch (FtpProtocolException e) { 24: // TODO Auto-generated catch block 25: e.printStackTrace(); 26: System.out.println("Download fail!"); 27: return false; 28: } catch (IOException e) { 29: // TODO Auto-generated catch block 30: e.printStackTrace(); 31: System.out.println("Download fail"); 32: return false; 33: }catch (Exception e) { 34: // TODO: handle exception 35: e.printStackTrace(); 36: return false; 37: } 38: finally{ 39: try { 40: is.close(); 41: os.close(); 42: ftpClient.close(); 43: } catch (IOException e) { 44: // TODO Auto-generated catch block 45: e.printStackTrace(); 46: } 47: } 48: }
四. 遍历FTP目录文件 1: /* 2: * FTP getFileList 3: * @param filenames 保存遍历的文件名 4: * @param path 遍历目录的路径 5: * */ 6: public static void getFtpFileList(List filenames,String path){ 7: //DataInputStream ds = null; 8: BufferedReader ds = null; 9: FtpClient ftpClient = getConnect(); 10: try { 11: ds = new BufferedReader(new InputStreamReader(ftpClient.nameList(path),"ISO-8859-1")); 12: String line = ""; 13: while((line = ds.readLine())!=null){ 14: line = new String(line.getBytes("ISO-8859-1"),"GBK"); 15: String name[] = line.split("/"); 16: filenames.add(name[name.length - 1]); 17: } 18: } catch (FtpProtocolException e) { 19: // TODO Auto-generated catch block 20: e.printStackTrace(); 21: } catch (IOException e) { 22: // TODO Auto-generated catch block 23: e.printStackTrace(); 24: }finally{ 25: try { 26: ds.close(); 27: ftpClient.close(); 28: } catch (IOException e) { 29: // TODO Auto-generated catch block 30: e.printStackTrace(); 31: } 32: } 33: } 如果用户名密码没有设置,可使用匿名用户登录,ftpClient.login( "anonymous", "[email protected]" ); anonymous这个是匿名的意思啊你登录很多FTP的时候都会用这个的,然后就是随便给个邮箱地址了邮箱地址不能不给的,要不然有些不让登陆 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |