经验证,在FTP服务端设定为被动模式,且客户端和服务端不在同一个网段的情况下,sun.net.ftp.FtpClient会出现上传文件失败(进程僵死,服务端接收到的文件大小为0)的情况,此为该类的一个BUG,建议使用java ftp时不要使用sun.net.ftp.FtpClient,而用APACHE基金会的commons-net.jar中的org.apache.commons.net.ftp.FTPClient来实现。
1.Jsp页面中:
<form method="post"enctype="multipart/form-data">
<input name=”file” type=”file”></form>
注:这里的form必须为post提交,并且有enctype属性(如果form中有其他类型input,并不影响Action中对其他input的值的接收)
2.Action中:
对应的file类型的input的name属性为:file
则应有3个属性接收:
File file;
String fileName;
String fileContentType;
其中 file为接收到的页面传来的文件(暂时存到tomcat的临时文件夹中,一般为tomcat根文件夹\work\当前项目\ 中)。fileName为该文件名,fileContentType为该文件类型(如:图片类型:image/jpeg)。
3.使用FTPClient连接FTP服务器org.apache.commons.net.ftp.FTPClient
FTPClient client = new FTPClient();
client.connect(FTP服务器IP地址); --连接FTP服务器
FTPReply.isPositiveCompletion(client.getReplyCode()); --判断是否连接成功
client.login(userName,password); --连接成功后使用用户名密码登陆(boolean返回值,可判断是否登陆成功)
client.setFileType(FTPClient.BINARY_FILE_TYPE); --设置FTP交互时使用的文件类型
4.FTPClient上传
client.changeWorkingDirectory(remotePath); --设置FTP上传对应的路径(boolean返回值,当存在路径时返回true)
client.makeDirectory(remotePath); --在FTP服务器中创建路径(boolean返回值)
FileInputStreamin = new FileInputStream(file);
client.storeFile(new String(fileName.getBytes("GBK"), "iso-8859-1"), in);
--设置上传到FTP中的文件名(注意编码格式,FTP中一般使用iso-8859-1),上传
5.FTPClient关闭
client.isConnected(); --FTP服务器是否在连接
client.disconnect(); --FTP连接关闭
这里注意在将client设置为静态变量时,关闭后将client置空,否则次连接时会出现异常