簡體   English   中英

JSP文件上傳。 從 FTP 到 SFTP 的轉換

[英]JSP file upload. Conversion from FTP to SFTP

我有一個 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 一起使用,例如參見Secure FTP with org.apache.commons.net.ftp.FTPClient

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM