FTP upload file ด้วย Java

FTP upload file ด้วย Java

ติดตั้ง FTP server ก่อน – ใช้ Filezilla Server

เปิดใช้งาน services -> Filezilla-server

เลือกใช้งาน Apache commons net

/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Main.java to edit this template
 */
package ftpuploader;

/**
 *
 * @author Thada
 */
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;

/**
 * คลาสนี้สาธิตวิธีการอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์ FTP โดยใช้ไลบรารี Apache Commons Net
 * คุณจำเป็นต้องเพิ่ม dependency ของ Apache Commons Net ในโปรเจกต์ของคุณก่อน
 *
 * สำหรับ Maven, เพิ่มในไฟล์ pom.xml:
 * <dependency>
 * <groupId>commons-net</groupId>
 * <artifactId>commons-net</artifactId>
 * <version>3.11.0</version>
 * </dependency>
 */
public class FTPUploader {

    private final String server;
    private final int port;
    private final String user;
    private final String pass;

    /**
     * Constructor เพื่อรับข้อมูลการเชื่อมต่อ FTP
     * @param server ที่อยู่ของ FTP server (เช่น ftp.example.com)
     * @param port พอร์ตของ FTP server (ปกติคือ 21)
     * @param user ชื่อผู้ใช้
     * @param pass รหัสผ่าน
     */
    public FTPUploader(String server, int port, String user, String pass) {
        this.server = server;
        this.port = port;
        this.user = user;
        this.pass = pass;
    }

    /**
     * เมธอดสำหรับอัปโหลดไฟล์เดียวไปยังเซิร์ฟเวอร์ FTP
     * @param localFilePath พาธของไฟล์บนเครื่องคอมพิวเตอร์ของคุณ
     * @param remoteFilePath พาธและชื่อไฟล์ที่ต้องการบันทึกบนเซิร์ฟเวอร์ FTP
     * @throws IOException เมื่อเกิดปัญหาในการเชื่อมต่อหรือการส่งไฟล์
     */
    public void uploadFile(String localFilePath, String remoteFilePath) throws IOException {
        FTPClient ftpClient = new FTPClient();
        try {
            // 1. เชื่อมต่อและล็อกอิน
            System.out.println("Connecting to " + server + "...");
            ftpClient.connect(server, port);
            boolean loggedIn = ftpClient.login(user, pass);

            if (!loggedIn) {
                System.out.println("Cannot login, please check user & password");
                return;
            }
            System.out.println("Login successfully");

            // 2. ตั้งค่าโหมดและประเภทไฟล์
            ftpClient.enterLocalPassiveMode(); // โหมด Passive สำคัญมากสำหรับเครือข่ายที่มี Firewall
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // ตั้งเป็นโหมดไบนารีเพื่อรองรับไฟล์ทุกประเภท

            // 3. เตรียมไฟล์สำหรับอัปโหลด
            File localFile = new File(localFilePath);
            if (!localFile.exists()) {
                System.out.println("Cannot find: " + localFilePath);
                return;
            }

            // 4. ทำการอัปโหลด
            try (InputStream inputStream = new FileInputStream(localFile)) {
                System.out.println("Start uploading the file: " + localFile.getName());
                boolean done = ftpClient.storeFile(remoteFilePath, inputStream);
                if (done) {
                    System.out.println("File '" + localFile.getName() + "' uploaded successfully");
                } else {
                    System.out.println("Upload fail");
                    // สามารถตรวจสอบ reply code เพิ่มเติมได้
                    // System.out.println("FTP Reply: " + ftpClient.getReplyString());
                }
            }

        } finally {
            // 5. ออกจากระบบและตัดการเชื่อมต่อเสมอ
            try {
                if (ftpClient.isConnected()) {
                    ftpClient.logout();
                    ftpClient.disconnect();
                    System.setOut(new PrintStream(System.out, true, "UTF-8"));
                    System.out.println("System.encoding: " + System.getProperty("file.encoding"));
                    System.out.println("Disconnected");
                    System.out.println("ตัดการเชื่อมต่อแล้ว");
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }

    /**
     * เมธอด main สำหรับทดสอบการทำงาน
     */
    public static void main(String[] args) {
        // --- กรุณากรอกข้อมูล FTP ของคุณที่นี่ ---
        String server = "127.0.0.1"; // <--- ใส่ชื่อเซิร์ฟเวอร์ของคุณ
        int port = 21;
        String user = "th";     // <--- ใส่ชื่อผู้ใช้ของคุณ
        String pass = "12345678";      // <--- ใส่รหัสผ่านของคุณ
        // ------------------------------------

        FTPUploader uploader = new FTPUploader(server, port, user, pass);

        try {
            // --- ระบุพาธไฟล์ของคุณ ---
            // ตัวอย่างสำหรับ Windows: "C:/Users/YourUser/Documents/report.pdf"
            // ตัวอย่างสำหรับ macOS/Linux: "/home/youruser/documents/report.pdf"
            File localFilePath = new File("C:\\Users\\Thada\\Desktop\\gen.info\\attribute.txt"); // <--- ใส่พาธไฟล์ในเครื่องของคุณ
            String localFileName = localFilePath.getName();
            String remoteFilePath = "/tmp/" + localFileName; // <--- ใส่พาธบนเซิร์ฟเวอร์
            // -------------------------

            uploader.uploadFile(localFilePath.toString(), remoteFilePath);

        } catch (IOException ex) {
            System.err.println("เกิดข้อผิดพลาดร้ายแรงระหว่างการอัปโหลด");
            ex.printStackTrace();
        }
    }
}

Connecting to 127.0.0.1...
Login successfully
Start uploading the file: attribute.txt
File 'attribute.txt' uploaded successfully
System.encoding: UTF-8
Disconnected
ตัดการเชื่อมต่อแล้ว

ถ้าไม่ได้เปิด service เอาไว้

Connecting to 127.0.0.1...
เกิดข้อผิดพลาดร้ายแรงระหว่างการอัปโหลด
java.net.ConnectException: Connection refused: getsockopt
	at java.base/sun.nio.ch.Net.pollConnect(Native Method)
	at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:628)
	at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:533)
	at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:583)
	at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:282)
	at java.base/java.net.Socket.connect(Socket.java:665)
	at org.apache.commons.net.SocketClient._connect(SocketClient.java:141)
	at org.apache.commons.net.SocketClient.connect(SocketClient.java:308)
	at org.apache.commons.net.SocketClient.connect(SocketClient.java:290)
	at ftpuploader.FTPUploader.uploadFile(FTPUploader.java:64)
	at ftpuploader.FTPUploader.main(FTPUploader.java:136)
BUILD SUCCESSFUL (total time: 0 seconds)