我有一个JSP页面,其中包含一个上传文件的链接。最初,文件传输是使用FTP进行的。服务器似乎仅使用FTP从客户端传输文件。我现在需要更改代码以支持SFTP。就像服务器在客户端计算机上启动FTP会话一样,SFTP是否也可能?这是客户端代码:
FTPClient client = new FTPClient(); FTPClient clientUser = new FTPClient(); //From ftp location (user saves file here) try { //Location where user chooses file from eas_user_import_ip_address_val = resovleJNDIResource.resolveJNDIString(eas_user_import_ip_address_tx); eas_user_import_id_val = resovleJNDIResource.resolveJNDIString(eas_user_import_id_tx); eas_user_import_pwd_val = resovleJNDIResource.resolveJNDIString(eas_user_import_pwd_tx); eas_user_file_prefix_val= resovleJNDIResource.resolveJNDIString(eas_user_file_prefix_tx); eas_user_file_prefix_val= eas_user_file_prefix_val.trim(); clientUser.connect(eas_user_import_ip_address_val); int replyUser = clientUser.getReplyCode(); if(!FTPReply.isPositiveCompletion(replyUser)) { ENTADJRuntime.getInstance().logError("FTPService", "Error connecting to:" + eas_user_import_ip_address_val + " reply code:" + replyUser); clientUser.disconnect(); return false; } boolean loginUser = clientUser.login(eas_user_import_id_val, eas_user_import_pwd_val); if (!loginUser) { ENTADJRuntime.getInstance().logError("FTPService", "Error logging in to:" + eas_user_import_id_val); return false; } //Location where file gets copied to. eas_import_ip_address_val = resovleJNDIResource.resolveJNDIString(eas_import_ip_address_tx); eas_import_id_val = resovleJNDIResource.resolveJNDIString(eas_import_id_tx); eas_import_pwd_val = resovleJNDIResource.resolveJNDIString(eas_import_pwd_tx); eas_part_file_prefix_val = resovleJNDIResource.resolveJNDIString(eas_part_file_prefix_tx); eas_p2p_file_prefix_val = resovleJNDIResource.resolveJNDIString(eas_p2p_file_prefix_tx); client.connect(eas_import_ip_address_val); int reply = client.getReplyCode(); if(!FTPReply.isPositiveCompletion(reply)) { ENTADJRuntime.getInstance().logError("FTPService", "Error connecting to:" + eas_import_ip_address_val + " reply code:" + reply); client.disconnect(); return false; } boolean login = client.login(eas_import_id_val, eas_import_pwd_val); if (!login) { ENTADJRuntime.getInstance().logError("FTPService", "Error loging in to:" + eas_import_id_val); return false; } //Loged in to From and To locations. Now transfer file clientUser.setFileType(FTP.ASCII_FILE_TYPE); clientUser.enterLocalActiveMode(); //from example String originalFileName = fileName; fileName = eas_user_file_prefix_val+fileName; InputStream ip = clientUser.retrieveFileStream(fileName); String issueIdStr = StringHelper.prepad(issueId + "", 10, '0'); String headerRecord = "HEADER " + adjPlatformCd + issueIdStr + batchId + " Original file : " + fileName; String trailerRecord = "TRAILER " + adjPlatformCd + issueIdStr + batchId + " Server file : " + eas_file_prefix_val + dt_tm_siz + ".csv"; client.setFileType(FTP.ASCII_FILE_TYPE); //First store file as ".tmp". First header then data followed by trailer boolean retValue = client.storeFile(eas_file_prefix_val + dt_tm_siz + ".tmp", new ByteArrayInputStream(headerRecord.getBytes())); if (!retValue) { ENTADJRuntime.getInstance().logError("FTPService", "Error creating:" + eas_file_prefix_val + dt_tm_siz + ".tmp"); return false; } retValue = client.appendFile(eas_file_prefix_val + dt_tm_siz + ".tmp", ip); if (!retValue) { ENTADJRuntime.getInstance().logError("FTPService", "Error append 1:" + eas_file_prefix_val + dt_tm_siz + ".tmp"); return false; } ip.close(); retValue = client.appendFile(eas_file_prefix_val + dt_tm_siz + ".tmp", new ByteArrayInputStream(trailerRecord.getBytes())); if (!retValue) { ENTADJRuntime.getInstance().logError("FTPService", "Error append 2:" + eas_file_prefix_val + dt_tm_siz + ".tmp"); return false; } boolean commandOK=clientUser.completePendingCommand(); // this command lets next few ftp commands proces successfully // place user file in PROCESSED folder. Append issue id, batch #, date and time if file length is < 230 String renamedUserFileName = eas_user_file_prefix_val+ "PROCESSED\\" + originalFileName.substring(0, originalFileName.lastIndexOf(".csv")) + "_" + issueId + "_" + batchId.trim() + dt_tm_siz + ".csv"; String someSiteCommand = "RNFR " + fileName; //rename from reply = clientUser.sendCommand(someSiteCommand); someSiteCommand = "RNTO " + renamedUserFileName; //rename to reply = clientUser.sendCommand(someSiteCommand); if(!FTPReply.isPositiveCompletion(reply)) { ENTADJRuntime.getInstance().logError("FTPService", "Error renaming:" + fileName + " reply code:" + reply); return false; } someSiteCommand = "RNFR " + eas_file_prefix_val + dt_tm_siz + ".tmp"; //rename from reply = client.sendCommand(someSiteCommand); someSiteCommand = "RNTO " + eas_file_prefix_val + dt_tm_siz + ".csv"; //rename to reply = client.sendCommand(someSiteCommand); if(!FTPReply.isPositiveCompletion(reply)) { ENTADJRuntime.getInstance().logError("FTPService", "Error renaming:" + eas_file_prefix_val + dt_tm_siz + ".tmp" + " reply code:" + reply); return false; } client.logout(); clientUser.logout();
就像服务器在客户端计算机上启动FTP会话一样,SFTP是否也可能?这是客户端代码:
SFTP是与FTP完全不同的协议,您可能无法重用任何FTP特定代码。可能是您的意思是FTPS,它是使用TLS扩展的FTP。如果支持此操作取决于服务器的设置,那就是仅更改客户端代码是不够的。只要服务器支持它,您就可以将其与Java一起使用,例如,参见带有org.apache.commons.net.ftp.FTPClient的Secure FTP。