从页面选择文件到FTP上传(使用struts2框架)

经验证,在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必须为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置空,否则次连接时会出现异常


你可能感兴趣的:(java)