ไม่กี่วันที่ผ่านมาฉันทำโครงการ ไคลเอนต์และผู้ดูแลระบบถูกเขียนเข้าด้วยกันและพวกเขาแบ่งปันเซิร์ฟเวอร์เดียวกัน ไฟล์ที่อัปโหลดโดยไคลเอนต์ทั้งหมดอยู่ในฮาร์ดดิสก์ของเซิร์ฟเวอร์ Lao Long เสนอให้แยกไคลเอนต์และด้านผู้ดูแลระบบและในเวลานี้มีปัญหากับการจัดเก็บไฟล์แนบที่อัพโหลดโดยผู้ใช้ เห็นได้ชัดว่ามันไม่สมจริงที่จะจัดเก็บไฟล์ APK ที่มีขนาดใหญ่ถึงหลายร้อยเมตรไปยังฐานข้อมูล หลังจากตรวจสอบเป็นเวลานานมันเป็นวิธีที่เร็วที่สุดในการสร้างเซิร์ฟเวอร์ FTP เพื่อส่งไฟล์ที่ปลายทั้งสอง
กระบวนการเฉพาะคือผู้ใช้เข้าสู่ไคลเอนต์เครือข่ายภายนอกและอัปโหลดไฟล์ไปยังฮาร์ดดิสก์เซิร์ฟเวอร์เครือข่ายภายนอก ในเวลาเดียวกันไฟล์จะเข้าถึงเซิร์ฟเวอร์ FTP ของเซิร์ฟเวอร์ผู้ดูแลระบบอินทราเน็ตผ่านเซิร์ฟเวอร์เครือข่ายภายนอกและส่งผ่านไปยังฮาร์ดดิสก์อินทราเน็ตเซิร์ฟเวอร์ ด้วยวิธีนี้เซิร์ฟเวอร์อินทราเน็ตสามารถเข้ารหัสและลงนามในไฟล์ที่อัปโหลดแล้วส่งไฟล์กลับไปยังฮาร์ดดิสก์เซิร์ฟเวอร์เครือข่ายภายนอกผ่าน FTP เพื่อให้ผู้ใช้ดำเนินการอื่น
เครื่องมือที่ใช้ในการใช้งานเฉพาะ: Serv-U Serv-U เป็นเครื่องมือที่อำนวยความสะดวกให้เราสร้างเซิร์ฟเวอร์ FTP บน Windows หลังจากดาวน์โหลดและแคร็กให้ทำตามขั้นตอนตั้งค่า IP, พอร์ต, รหัสผ่านบัญชี, เส้นทางดิสก์ที่อนุญาตให้เข้าถึง FTP สิทธิ์การทำงาน ฯลฯ และคุณสามารถใช้งานได้ เมื่อทดสอบ IP ให้เลือก 127.0.0.1 และเมื่อทดสอบ IP ในอินทราเน็ตให้เลือก 192.168.0.x
ในการใช้งานโครงการ Java ฉันเขียนคลาสเครื่องมือด้วยตัวเองและใช้แพ็คเกจ Pommons-Net ของ Apache ซึ่งมีการอัปโหลดดาวน์โหลดและลบฟังก์ชั่น รหัสที่แนบมา:
แพ็คเกจ app.ftp; นำเข้า Java.io.File; นำเข้า Java.io.FileInputStream; นำเข้า java.io.filenotfoundException; นำเข้า Java.io.FileOutputStream; นำเข้า java.io.ioException; นำเข้า Java.io.InputStream; นำเข้า Java.io.OutputStream; นำเข้า org.apache.commons.net.ftp.ftpclient; นำเข้า org.apache.commons.net.ftp.ftpfile; นำเข้า org.apache.commons.net.ftp.ftpreply; /*** คลาสเครื่องมือเซิร์ฟเวอร์ FTP** /คลาสสาธารณะคลาส ftputils { /*** อัปโหลดไฟล์ไปยังเซิร์ฟเวอร์ ftp** @param url* ที่อยู่ ip เซิร์ฟเวอร์* @param พอร์ต* พอร์ตเซิร์ฟเวอร์* @param ชื่อผู้ใช้* ชื่อผู้ใช้* @param รหัสผ่าน* @param <b> true </b>: อัปโหลดสำเร็จ* <br/>* <b> false </b>: อัปโหลดล้มเหลว*/public Static Boolean storeFile (url สตริง, พอร์ต int, ชื่อผู้ใช้สตริง, รหัสผ่านสตริง, สตริง storepath, ชื่อไฟล์สตริง ftpClient ftp = new ftpClient (); ลอง {// เมื่อเชื่อมต่อกับเซิร์ฟเวอร์พอร์ตเริ่มต้นกับ 21 คุณสามารถเชื่อมต่อ ftp.connect (URL, พอร์ต) โดยตรง; // เข้าสู่ระบบไปยังเซิร์ฟเวอร์ ftp.login (ชื่อผู้ใช้รหัสผ่าน); // ตรวจสอบว่ารหัสส่งคืนนั้นถูกกฎหมายหาก (! ftpreply.ispositiveCompletion (ftp.getReplyCode ())) {// disconnect เมื่อ ftp.disconnect () ที่ผิดกฎหมาย (); // สิ้นสุดผลการส่งคืนโปรแกรม; } // พิจารณาว่าไดเรกทอรี FTP มีอยู่หรือไม่ หากไม่มีอยู่ให้สร้างไดเรกทอรีรวมถึงการสร้างสตริงไดเรกทอรีหลายระดับ S = "/"+StorePath; สตริง [] dirs = s.split ("/"); ftp.changeworkingDirectory ("/"); // ตรวจสอบว่าไดเรกทอรีมีอยู่ในลำดับหรือไม่ หากไม่มีอยู่ให้สร้างไดเรกทอรีสำหรับ (int i = 1; dirs! = null && i <dirs.length; i ++) {ถ้า (! ftp.changeworkingdirectory (dirs [i])) {ถ้า (ftp.makedirectory }} else {return false; }}} // ตั้งค่าไดเรกทอรีการทำงานของไฟล์ ftp.changeworkingDirectory (StorePath); // ตั้งค่าประเภทไฟล์, binary ftp.setFileType (ftpclient.binary_file_type); // ตั้งค่าบัฟเฟอร์ขนาด ftp.setBuffersize (3072); // อัปโหลดไฟล์ผลลัพธ์ = ftp.storefile (ชื่อไฟล์, IS); // ปิดสตรีมอินพุตคือ. close (); // ออกจากระบบเซิร์ฟเวอร์ ftp.logout (); } catch (ioexception e) {e.printstacktrace (); } ในที่สุด {ลอง {// ตรวจสอบว่า (null! = IS) {// ปิดสตรีมอินพุตคือ. close (); } // ตรวจสอบว่าการเชื่อมต่อมีอยู่ถ้า (ftp.isconnected ()) {// disconnect ftp.disconnect (); }} catch (ioexception e) {e.printstacktrace (); }} ผลการส่งคืน; }/** * ดาวน์โหลดไฟล์จากเซิร์ฟเวอร์ ftp ไปยังท้องถิ่น * * @param url * ที่อยู่ IP เซิร์ฟเวอร์ * @param พอร์ต * พอร์ตเซิร์ฟเวอร์ * @param ชื่อผู้ใช้ * ชื่อผู้ใช้เข้าสู่ระบบ * @param รหัสผ่าน * รหัสผ่านเข้าสู่ระบบของผู้ใช้ * @param remotepath * เส้นทางการจัดเก็บไฟล์เซิร์ฟเวอร์ <b> FALSE </b>: ดาวน์โหลดล้มเหลว*/ Public Static Boolean RetrieveFile (url สตริง, พอร์ต int, ชื่อผู้ใช้สตริง, รหัสผ่านสตริง, สตริง remotepath, ชื่อไฟล์สตริง, สตริง localpath) {boolean result = false; ftpreply.ispositiveCompletion (ftp.getReplyCode ())) {// ตัดการเชื่อมต่อเมื่อพอร์ตไม่ถูกกฎหมาย // สิ้นสุดผลการส่งคืนโปรแกรม; } // ตั้งค่าไดเรกทอรีการทำงานของไฟล์ ftp.changeworkingdirectory (remotepath); // ตั้งค่าประเภทไฟล์, binary ftp.setfileType (ftpclient.binary_file_type); // ตั้งค่าขนาดบัฟเฟอร์ ftp.setBuffersize (3072); // ตั้งค่าอักขระการเข้ารหัส ftp.setControlencoding ("UTF-8"); // สร้างไฟล์ไฟล์โลคัลไฟล์ localfile = ไฟล์ใหม่ (localPath + "/" + ชื่อไฟล์); // รับชื่อไฟล์ทั้งหมดในสตริงการดำเนินการไฟล์ [] remotenames = ftp.listnames (); // การวนซ้ำชื่อไฟล์เพื่อตรวจสอบว่ามีชื่อไฟล์ที่จะดาวน์โหลดสำหรับ (remotename remotename: remotenames) {ถ้า (filename.equals (remotename)) {result = true; }} // เมื่อการเปรียบเทียบชื่อไฟล์สำเร็จให้ป้อนกระบวนการดาวน์โหลดถ้า (ผลลัพธ์) {// สร้างสตรีมเอาต์พุตไฟล์ OS = ใหม่ fileOutputStream (localFile); // ดาวน์โหลดไฟล์ผลลัพธ์ = ftp.retrieveFile (ชื่อไฟล์, ระบบปฏิบัติการ); // ปิดสตรีมเอาต์พุต OS.CLOSE (); } // ออกจากระบบเซิร์ฟเวอร์ ftp.logout (); } catch (ioexception e) {e.printstacktrace (); } ในที่สุด {ลอง {// ตรวจสอบว่ากระแสเอาต์พุตมีอยู่ถ้า (null! = os) {// ปิดสตรีมเอาต์พุต os.close (); } // พิจารณาว่าการเชื่อมต่อมีอยู่ถ้า (ftp.isconnected ()) {// disconnect ftp.disconnect (); }} catch (ioexception e) {e.printstacktrace (); }} ผลการส่งคืน; }/*** ลบไฟล์จากเซิร์ฟเวอร์ ftp** @param url* ที่อยู่ IP เซิร์ฟเวอร์* @param พอร์ต* @param ชื่อผู้ใช้* ชื่อผู้ใช้เข้าสู่ระบบ* @param รหัสผ่าน* รหัสผ่านเข้าสู่ระบบของผู้ใช้* @param remotepath* เส้นทางการจัดเก็บไฟล์เซิร์ฟเวอร์* @param filename* Public Static Boolean DeleteFile (String URL, int พอร์ต, ชื่อผู้ใช้สตริง, รหัสผ่านสตริง, สตริง remotePath, ชื่อไฟล์สตริง) {ผลลัพธ์บูลีน = false; ftpClient ftp = new ftpClient (); ลอง {// เมื่อเชื่อมต่อกับเซิร์ฟเวอร์พอร์ตเริ่มต้นกับ 21 คุณสามารถเชื่อมต่อ ftp.connect (URL, พอร์ต) โดยตรง; // เข้าสู่ระบบไปยังเซิร์ฟเวอร์ ftp.login (ชื่อผู้ใช้รหัสผ่าน); // ตรวจสอบว่ารหัสส่งคืนนั้นถูกกฎหมายหาก (! ftpreply.ispositiveCompletion (ftp.getReplyCode ())) {// ตัดการเชื่อมต่อเมื่อไม่ได้ถูกกฎหมาย ftp.disconnect (); // สิ้นสุดผลการส่งคืนโปรแกรม; } // ตั้งค่าไดเรกทอรีการทำงานของไฟล์ ftp.changeworkingdirectory (remotepath); // ตั้งค่าประเภทไฟล์, binary ftp.setfileType (ftpclient.binary_file_type); // ตั้งค่าขนาดบัฟเฟอร์ ftp.setBuffersize (3072); // ตั้งค่าอักขระการเข้ารหัส ftp.setControlencoding ("UTF-8"); // รับชื่อไฟล์ทั้งหมดในสตริงการดำเนินการไฟล์ [] remotenames = ftp.listnames (); // loop เพื่อเปรียบเทียบชื่อไฟล์เพื่อตรวจสอบว่าชื่อไฟล์ที่จะดาวน์โหลดนั้นมีอยู่ในปัจจุบันสำหรับ (String Remotename: Remotenames) {ถ้า (filename.equals (remotename)) {result = true; }} // เมื่อการเปรียบเทียบชื่อไฟล์สำเร็จให้ป้อนกระบวนการลบถ้า (ผลลัพธ์) {// ลบผลไฟล์ = ftp.deleteFile (ชื่อไฟล์); } // ออกจากระบบเซิร์ฟเวอร์ ftp.logout (); } catch (ioexception e) {e.printstacktrace (); } ในที่สุด {ลอง {// ตรวจสอบว่าการเชื่อมต่อมีอยู่ถ้า (ftp.isconnected ()) {// ยกเลิกการเชื่อมต่อ ftp.disconnect (); }} catch (ioexception e) {e.printstacktrace (); }} ผลการส่งคืน; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่น filenotfoundexception {// ลอง {// fileinputstream fis = ใหม่ fileInputStream (ไฟล์ใหม่ ("d:/soft storage/soft toolbox/html_help_workshop_1.3_xiazaiba.zip")); // system.out.println (oreDfile ("192.168.1.2", 21, "ผู้ดูแลระบบ", "1", "C:/เอกสารและการตั้งค่า/ผู้ดูแลระบบ/เดสก์ท็อป", randomuuid.random () + ".zip", fis); //} catch (filenotfoundexception e) {// e.printstacktrace (); //} // // ไฟล์ไฟล์ = ไฟล์ใหม่ ("c: /users/freed/desktop/1.txt"); // inputStream คือ = new FileInputStream (ไฟล์); //system.out.println(storefile("127.0.0.1 ", 21," feili "," feili "," ตัวอย่าง "," 2.txt ", IS)); //system.out.println(retrievefile("127.0.0.1 ", 21," feili "," feili "," ตัวอย่าง/jsp "," index.html "," c:/ผู้ใช้/ฟรี/เดสก์ท็อป ")); //system.out.println(deletefile("127.0.0.1 ", 21," feili "," feili "," testpath "," 1.txt ")); -ควรสังเกตว่าเมื่ออัปโหลดไฟล์คุณต้องใส่ไฟล์ลงใน FileInputStream ก่อน
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น