java 上传FTP遇到的坑

一、生成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文件的接口,所以才会一直出现这个情况,真是坑的自己没商量,低级错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做紧咩嘢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值