zoukankan      html  css  js  c++  java
  • 关于java调用sftp下载文件报 No such File 错误的问题总结

    今晚总结下今下午遇到的java调用sftp下载对账文件报错的问题:

      一开始配置文件是这样写的

      

     而sftp的路径是这样的

    java代码是这样写的

     private boolean downloadSettleFile(String downloadPath,String merId,String merDate,SFTPUtil sftp,int num) throws Exception{
            logger.info(" 付款对账文件下载接口开始入参商户号:{},交易日期:{}",merId,merDate);
            String fileName="TAM_MER_"+merId+"_"+merDate+".dat";
            Object object = resource.get("sftp_path");
            String sftp_path=String.valueOf(object);
            sftp.download(sftp_path, fileName, downloadPath+fileName);
            return true;
        }

    这样去调用后报错如下

     上网查资料,见这方面的资料很少,于是就自己琢磨,一般报这个错是因为路径的问题,看了sftp的路径后以为是从根路径开始,所以修改路径如下,

     抱着侥幸的心理再次尝试,结果不尽人意,还是一样的错误,悲哀~

    既然这样还不行,那就看看代码怎么写的吧,于是乎,开始梳理代码,进入sftp的下载方法如下

     /** 
         * 下载文件。
         * @param directory 下载目录  
         * @param downloadFile 下载的文件 
         * @param saveFile 存在本地的路径 
         */    
        public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException{  
            if (directory != null && !"".equals(directory)) {  
                sftp.cd(directory);  
            }  
            File file = new File(saveFile);  
            sftp.get(downloadFile, new FileOutputStream(file));  
        }    

    从代码中不难发现,是把目录当成文件夹名字给cd进去了,然后再在文件夹下找到相应的文件的,恍然大悟啊,修改之后

     这样就把cmpay当成一个文件夹进入了,一试,果然可以成功下载了

     还有一个需要注意的问题是,如果循环下载文件的时候不要重复进入文件夹,给个变量判断下就好

     private boolean downloadSettleFile(String downloadPath,String merId,String merDate,SFTPUtil sftp,int num) throws Exception{
            logger.info(" 付款对账文件下载接口开始入参商户号:{},交易日期:{}",merId,merDate);
            String fileName="TAM_MER_"+merId+"_"+merDate+".dat";
            Object object = resource.get("sftp_path");
            String sftp_path=String.valueOf(object);
            // 只有第一次下载需要进入文件夹,之后的不需要在进入文件夹
            if(num > 0){
                sftp_path="";
            }
            sftp.download(sftp_path, fileName, downloadPath+fileName);
            return true;
        }

    因为我是循环调用的

    /**
         * 对账文件入库
         * @param tyjSaleActrDTOList
         * @throws IOException
         */
        private String cmPaymentCheckInsertData(List<TyjSaleActrDTO> tyjSaleActrDTOList) throws IOException {
            logger.info("====对账文件入库开始========");
            String flag = "0";
            Calendar cal = Calendar.getInstance();
            //获取前两天得对账文件对账
            cal.add(Calendar.DATE,-1);
            SimpleDateFormat sf=new SimpleDateFormat("yyyyMMdd");
            String settleDate =sf.format(cal.getTime());
            logger.info(settleDate+"......定时任务下载对账文件开始.........");
            Object obj1=resource.get("mer_id_settle_path");
            String downloadPath=String.valueOf(obj1);
            Object obj2 = resource.get("sftp_username");
            String sftp_username=String.valueOf(obj2);
            Object obj3 = resource.get("sftp_password");
            String sftp_password=String.valueOf(obj3);
            Object obj4 = resource.get("sftp_ip");
            String sftp_ip=String.valueOf(obj4);
            Object obj5 = resource.get("sftp_port");
            String sftp_port=String.valueOf(obj5);
            SFTPUtil sftp = new SFTPUtil(sftp_username,sftp_password,sftp_ip, Integer.parseInt(sftp_port));
            sftp.login();
            for (int i = 0; i < tyjSaleActrDTOList.size(); i++) {
                TyjSaleActrDTO dto=tyjSaleActrDTOList.get(i);
                String merId=dto.getCorpMerchantNum();
                try {
                    boolean result =this.downloadSettleFile(downloadPath, merId, settleDate,sftp,i);
                    logger.info("商户号:"+merId+"----"+settleDate+"对账日下载对账文件结果:"+result);
                    if(result) {
                        try {
                            String fileName=downloadPath+"TAM_MER_"+merId+"_"+settleDate+".dat";
                            logger.info("要入库的对账文件======={}",fileName);
                            File file=new File(fileName);
                            if(file.exists()){
                                InputStreamReader reader = new InputStreamReader(new FileInputStream(fileName),"GBK"); // 建立一个输入流对象reader  
                                    BufferedReader br = new BufferedReader(reader); // 建立一个对象,它把文件内容转成计算机能读懂的语言  
                                    String line = null;  
                                    while ((line=br.readLine())!=null) {
                                          CmpaySettleFileRes res=this.chengeToDTO(line);
                                          if(res!=null){
                                              TyjDzResultDTO dzResultDto = new TyjDzResultDTO();
                                              // 提现单id
                                              String transId = res.getRequestId();
                                              dzResultDto.setAccType(res.getAccType());
                                              dzResultDto.setAmount(Double.parseDouble(res.getAmount()==null?"0":res.getAmount()));
                                              dzResultDto.setCreateDate(new Date());
                                              dzResultDto.setDzFileName(fileName);
                                              dzResultDto.setDzState("0");
                                              dzResultDto.setJyf(Double.parseDouble(res.getFeeAmount()==null?"0":res.getFeeAmount()));
                                              dzResultDto.setMerchantId(res.getMerchantId());
                                              dzResultDto.setOrderId(res.getTransNo());
                                              dzResultDto.setOrderTime(res.getOrderDate());
                                              dzResultDto.setOrderSxTime(res.getOrderNoEffectDate());
                                              dzResultDto.setPaymentDate(res.getTransDate());
                                              dzResultDto.setReceiveDate(res.getRecvDate());
                                              dzResultDto.setReceiveTel(res.getReceiveNo());
                                              dzResultDto.setRequestId(transId);
                                              dzResultDto.setStatus(res.getOrderStatus());
                                              dzResultDto.setTransId(transId);
                                              // 保存数据
                                              tYjDzResultService.saveDtoTX(dzResultDto);
                                              logger.info("对账文件===="+fileName+"=====入库成功ok");
                                          }
                                      }
                                    br.close();
                                }
                        } catch (Exception e) {
                            flag="2";
                            logger.info("对账文件入库异常======={}",e.getMessage());
                        }
                    }
            }catch(Exception e){
                 flag="1";
                 logger.info("商户号:"+merId+"----"+settleDate+"下载对账执行异常:"+e.getMessage());
            }
          }
          sftp.logout();
          
          return flag;
        }

    这是今天解决的一个问题,在这记录下,希望对大家有所帮助,有啥问题及时沟通交流就好,技术方面的问题还是很希望和大家一起探讨的

  • 相关阅读:
    用函数装饰一首诗
    [转]最常用的15大Eclipse开发快捷键技巧
    [转]python 模块 chardet下载及介绍
    python手动设置递归调用深度
    view-xpath
    开源项目的贡献流程
    MIT许可证
    scrapy分布式的几个重点问题
    【bzoj1026】[SCOI2009]windy数 数位dp
    【bzoj5064】B-number 数位dp
  • 原文地址:https://www.cnblogs.com/sjs355/p/11992632.html
Copyright © 2011-2022 走看看