一、生成XML文件并上传到FTP服务器
首先使用XStream进行对java bean与xml文件的转换。
/** * 实体转xml字符串 * @param obj * @return */ public String toXml(Object obj) { XStream xstream = new XStream(new DomDriver("utf8")); xstream.processAnnotations(obj.getClass()); // 识别obj类中的注解 return xstream.toXML(obj); }
java bean
@Data @XStreamAlias("asn ") public class ExpertToXmlDto { @XStreamAlias("DocumentID") private String documentId; @XStreamAlias("ASNNumber") private String orderType; @XStreamAlias("Vendor") private VendorToXmlDto vendorToXmlDto;
}
转换成功之后进行FTP登录连接上传。
FTP登录连接:
/** * 获取FTPClient对象 * * @param ftpHost * FTP主机服务器 * @param ftpPassword * FTP 登录密码 * @param ftpUserName * FTP登录用户名 * @param ftpPort * FTP端口 默认为21 * @return */ public static FTPClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort) { FTPClient ftpClient = new FTPClient(); try { ftpClient = new FTPClient(); ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器 ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器 if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { logger.info("未连接到FTP,用户名或密码错误。"); ftpClient.disconnect(); } else { logger.info("FTP连接成功。"); } } catch (SocketException e) { e.printStackTrace(); logger.info("FTP的IP地址可能错误,请正确配置。"); } catch (IOException e) { e.printStackTrace(); logger.info("FTP的端口错误,请正确配置。"); } return ftpClient; }
FTP进行测试上传:
/** * FTP上传单个文件测试 * 1.连接服务 * 2.确定你要上传的文件 * 3.指定你在服务器端存放的位置 */ public boolean testUpload(String url,int port,String username, String password, String path, String filename, InputStream input) { //FTP登录服务器 FTPClient ftpClient = FtpUtil.getFTPClient(url,username,password,port); FileInputStream fis = null; try { ftpClient.setBufferSize(1024); ftpClient.setControlEncoding("GBK"); //设置为被动模式 ftpClient.enterLocalPassiveMode(); //设置文件类型(二进制) ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); // ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE); File srcFile = new File(file.getPath()+"/"+filename); fis = new FileInputStream(srcFile); System.out.println(fis.read()); //设置上传目录 ftpClient.changeWorkingDirectory(path); //filename:文件名 input:源文件流 boolean result = ftpClient.storeFile(srcFile.getName(), fis); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("FTP客户端出错!", e); } finally { IOUtils.closeQuietly(fis); try { ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("关闭FTP连接发生异常!", e); } } return true; }最后发现文件确实是上传到FTP服务器上,但是一直就是0字节,当时查了很多资料,说是把FTP连接改成设置为被动模式即可解决问题,对于没有遇到其他坑的,加上之后确实是能解决问题,但是我在之前已经加上,于是去排查代码,发现在我使用XMLwriter工具把xml字符串转变成文件的时候,在未关闭输入流就调用了上传FTP文件的接口,所以才会一直出现这个情况,真是坑的自己没商量,低级错误