伺服器上下載檔案FTP

lession07發表於2020-12-29

具體分為分為兩個步驟走
我傳入的地址格式為//127.0.0.1//test/aa.gif

  1. 連結,根據IP,埠號(預設埠號可不填),使用者名稱密碼登入
 public static FTPClient getFTPClient(NASVo vo) {
        FTPSClient ftp = new FTPSClient();
        try {
            ftp.setAutodetectUTF8(true);
            ftp.setDataTimeout(6000000);       //設定傳輸超時時間為6000秒
            ftp.setConnectTimeout(6000000);
            ftp.connect(vo.getApi());
            // 如果採用預設埠,可以使用ftp.connect(host)的方式直接連線FTP伺服器
            ftp.login(vo.getName(), vo.getPassword());// 登入
            if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
                logger.error("使用者名稱或密碼錯誤;");
                ftp.disconnect();
            } else {
                logger.info("連線成功");
            }
        } catch (SocketException e) {
            logger.error("檢查IP地址是否正確",e);
        } catch (IOException e) {
            logger.error("檢查埠是否正確}",e);
        }
        return ftp;
    }
  1. 為防止檔名和路徑中文亂碼,設定編碼進行下載
  //下載
    public List<String> downloadFtpFileOld(String ftpPath, String localPath, String fileName, NASVo vo) {
        FTPClient ftpClient = null;
        List<String> list = new ArrayList<>();
        try {
            ftpClient = getFTPClient(vo);
            ftpClient.setControlEncoding("UTF-8"); // 中文支援
            if (FTPReply.isPositiveCompletion(ftpClient.sendCommand(
                    "OPTS UTF8", "ON"))) {// 開啟伺服器對UTF-8的支援,如果伺服器支援就用UTF-8編碼,否則就使用本地編碼(GBK).
                LOCAL_CHARSET = "UTF-8";
            }
            ftpClient.setControlEncoding(LOCAL_CHARSET);
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftpClient.enterLocalPassiveMode();
            ftpPath = "/" + ftpPath;
            ftpClient.changeWorkingDirectory(ftpPath);
            fileName = fileName.substring(0, fileName.lastIndexOf("."));
            //之前配置了正式路徑的nginx靜態檔案,所以我返回了地址
            //127.0.0.1替換成正式路徑的地址
            list.add("http://127.0.0.1/test/"+fileName + ".gltf");
            FTPFile[] ftpFiles = ftpClient.listFiles();
            for (FTPFile file : ftpFiles) {
                String fileNames = file.getName();
                if (fileNames.contains(fileName)) {
                    File localfile = new File(localPath + "/" + fileNames);
                    FileOutputStream output = new FileOutputStream(localfile);//建立localfile檔案
                    boolean aa = ftpClient.retrieveFile(fileNames, output);//從ftp伺服器中檢索檔案,寫入FileOutputStream中(只能寫入FileOutputStream)
                    System.out.println("是否下載成功"+aa);
                    if (output != null) {
                        output.close();
                    }
                }
            }
        } catch (FileNotFoundException e) {
            logger.error("沒有找到{}檔案", localPath + "-----" + File.separatorChar + "-----" + fileName, e);
        } catch (SocketException e) {
            logger.error("連線FTP失敗。", e);
        } catch (IOException e) {
            logger.error("檔案讀取錯誤。", e);
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return list;
    }

相關文章