今晚總結下今下午遇到的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; }
這是今天解決的一個問題,在這記錄下,希望對大家有所幫助,有啥問題及時溝通交流就好,技術方面的問題還是很希望和大家一起探討的