เมื่อเร็ว ๆ นี้ฉันพบความจำเป็นในการอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์ Linux ระหว่างการพัฒนาขื้นใหม่และตอนนี้ฉันได้จัดเรียงบันทึกรหัสแล้ว
วิธีการเชื่อมต่อนี้คำนึงถึงปัญหาพร้อมกันและเมื่อสร้างการเชื่อมต่อ FTP วัตถุการเชื่อมต่อแต่ละรายการจะถูกเก็บไว้ใน
Threadlocal <FTP> เพื่อให้แน่ใจว่าแต่ละเธรดไม่มีผลต่อการเปิดและปิด FTP
แพ็คเกจ com.test.utils; นำเข้า java.io.bufferedinputstream; นำเข้า java.io.file; นำเข้า java.io.filefilter; นำเข้า java.io.fileinputstream; นำเข้า Java.io.inputstream; นำเข้า Java.util.arraylist; org.apache.commons.logging.log; นำเข้า org.apache.commons.logging.logfactory; นำเข้า com.jcraft.jsch.channelsftp; นำเข้า com.jcraft.jsch.jsch; นำเข้า logfory.sch.session; วันที่คงที่ส่วนตัว last_push_date = null; เซสชั่นส่วนตัว sshsession; ช่องส่วนตัวช่องสัญญาณ; private static threadlocal <ftp> sftplocal = new ThreadLocal <ftp> (); FTP ส่วนตัว (โฮสต์สตริง, พอร์ต int, ชื่อผู้ใช้สตริง, รหัสผ่านสตริง) โยนข้อยกเว้น {JSCH JSCH = new JSCH (); jsch.getSession (ชื่อผู้ใช้, โฮสต์, พอร์ต); // รับเซสชัน sshsession = jsch.getSession (ชื่อผู้ใช้, โฮสต์, พอร์ต); sshsession.setPassword (รหัสผ่าน); // ปรับเปลี่ยนค่าของ GSSAPIAUTHENTICATION ในเซิร์ฟเวอร์/etc/ssh/sshd_config เป็นไม่ใช่ไม่ใช่ซึ่งแก้ปัญหาการไม่สามารถเข้าสู่ระบบ sshsession.setconfig จากระยะไกล ("userauth.gssapi-with-mic", "ไม่"); // ตั้งค่าคุณสมบัติสำหรับวัตถุเซสชัน เมื่อเข้าถึงเซิร์ฟเวอร์เป็นครั้งแรกคุณไม่จำเป็นต้องป้อนใช่ sshsession.setConfig ("StricthostkeyChecking", "No"); sshsession.connect (); // รับช่อง SFTP channel = (channelsftp) sshsession.openchannel ("sftp"); channel.connect (); logger.info ("เชื่อมต่อ FTP สำเร็จ!" + sshsession); } / ** * เชื่อมต่อ * * @return * / บูลีนส่วนตัว isConnected () {return null! = channel && channel.isconnected (); } /** * รับไคลเอนต์ SFTP ที่เก็บไว้ในเธรดท้องถิ่น * * @return * @throws Exception * /สาธารณะ FTP GetSftputil (สตริงโฮสต์, พอร์ต int, ชื่อผู้ใช้สตริง, รหัสผ่านสตริง) if (null == sftputil ||! sftputil.isconnected ()) {// ป้องกันการเชื่อมต่อใหม่เพื่อป้องกันเธรดท้องถิ่นและใช้การประมวลผลพร้อมกัน sftplocal.set (FTP ใหม่ (โฮสต์, พอร์ต, ชื่อผู้ใช้, รหัสผ่าน)); } ส่งคืน sftplocal.get (); } / *** ปล่อยไคลเอนต์ SFTP ที่เก็บเธรดท้องถิ่น* / โมฆะคงที่สาธารณะ () {ถ้า (null! = sftplocal.get ()) {sftplocal.get (). closeChannel (); logger.info ("ปิดการเชื่อมต่อ" + sftplocal.get (). sshsession); sftplocal.set (null); }} / ** * ปิดช่อง * * @throws Exception * / โมฆะสาธารณะ CloseChannel () {ถ้า (null! = channel) {ลอง {channel.disconnect (); } catch (exception e) {logger.error ("ข้อยกเว้นเกิดขึ้นเมื่อปิดช่องสัญญาณ SFTP:", e); }} if (null! = sshsession) {ลอง {sshsession.disconnect (); } catch (exception e) {logger.error ("SFTP ปิดเซสชันข้อยกเว้น:", e); }}} /*** @param ไดเรกทอรีไดเรกทอรีสำหรับการอัปโหลด ftp* @param uptoadfile ไดเรกทอรีไฟล์ท้องถิ่น** /โมฆะสาธารณะอัพโหลด (ไดเรกทอรีสตริง, สตริง uploadfile) โยนข้อยกเว้น {ลอง {<br> // รายการ <file> files = getFiles (uploadfile, arraylist ใหม่ <file> ()); สำหรับ (int i = 0; i <files.size (); i ++) {ไฟล์ไฟล์ = files.get (i); inputstream input = new bufferedInputStream (ใหม่ FileInputStream (ไฟล์)); channel.put (input, file.getName ()); ลอง {ถ้า (อินพุต! = null) input.close (); } catch (exception e) {e.printstacktrace (); logger.error (file.getName () + "ข้อยกเว้นเมื่อปิดไฟล์ ... ข้อยกเว้น!" + e.getMessage ()); } if (file.exists ()) {boolean b = file.delete (); logger.info (file.getName () + "ไฟล์อัปโหลด! ลบ ID:" + b); }}}} catch (Exception e) {logger.error ("[[subdirectory กำลังถูกสร้างขึ้น]:", e); // สร้างช่องทางย่อย MKDIR (ไดเรกทอรี); }} // รับรายการไฟล์สาธารณะ <file> getFiles (String RealPath, รายการ <file> ไฟล์) {ไฟล์ realfile = ไฟล์ใหม่ (RealPath); if (realfile.isdirectory ()) {ไฟล์ [] subfiles = realfile.listfiles (filefilter ใหม่ () {@Override บูลีนสาธารณะยอมรับ (ไฟล์ไฟล์) {ถ้า (null == last_push_date) {ส่งคืนจริง; - สำหรับ (ไฟล์ไฟล์: subfiles) {if (file.isdirectory ()) {getFiles (file.getabsolutepath (), ไฟล์); } else {files.add (ไฟล์); } if (null == last_push_date) {last_push_date = วันที่ใหม่ (file.lastmodified ()); } else {long modifyDate = file.lastModified (); if (modifydate> last_push_date.getTime ()) {last_push_date = วันที่ใหม่ (modifydate); }}}} ส่งคืนไฟล์; -สรุป
ด้านบนคือการเชื่อมต่อ Java Remote ไปยังเซิร์ฟเวอร์ Linux ดำเนินการคำสั่งและอัปโหลดไฟล์ที่แนะนำโดยตัวแก้ไข ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉัน บรรณาธิการจะตอบกลับทุกคนในเวลา!