關於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;
    }

這是今天解決的一個問題,在這記錄下,希望對大家有所幫助,有啥問題及時溝通交流就好,技術方面的問題還是很希望和大家一起探討的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM