菜鸟科技网

代码如何上传FTP?新手教程看这里!

目录

  1. 第一步:准备工作(最重要!)
    • 1 获取FTP服务器信息
    • 2 安装FTP客户端(用于测试)
    • 3 选择你的编程语言
  2. 第二步:使用命令行工具(无需编程)
    • 1 Windows (PowerShell)
    • 2 Linux / macOS
  3. 第三步:使用编程语言上传文件(代码实现)
    • 1 Python (最推荐,简洁强大)
    • 2 Node.js (适合Web应用)
    • 3 Java (企业级应用)
    • 4 PHP (Web开发常用)
  4. 第四步:高级技巧与最佳实践
    • 1 处理错误和异常
    • 2 上传整个文件夹
    • 3 使用SFTP(更安全的替代方案)
    • 4 关于FTP用户权限
  5. 总结与建议

第一步:准备工作(最重要!)

在写任何代码之前,你必须先确认以下信息,否则代码无法连接到服务器。

代码如何上传FTP?新手教程看这里!-图1
(图片来源网络,侵删)

1 获取FTP服务器信息

联系你的服务器管理员或查看你的主机提供商(如阿里云、腾讯云、Bluehost等)的后台,获取以下信息:

  • 主机名: 服务器的IP地址或域名(ftp.yourdomain.com168.1.100)。
  • 用户名: 用于登录FTP账户的用户名。
  • 密码: 对应的密码。
  • 端口: FTP的默认端口是 21,有时服务器会使用其他端口(如2121)。SFTP的默认端口是22
  • 上传路径: 登录后,你的默认目录在哪里?你想把文件上传到哪个具体的文件夹下?(/public_html/uploads//var/www/html/files/

2 安装FTP客户端(用于测试)

在写代码之前,强烈建议你先用一个图形化的FTP客户端软件来测试连接和上传,确保你的服务器信息是正确的,并且你有上传文件的权限。

  • FileZilla (免费、跨平台): https://filezilla-project.org/

    使用你获取到的主机名、用户名、密码、端口进行连接,尝试上传一个文件,如果成功,说明你的环境是通的。

3 选择你的编程语言

根据你的项目需求选择合适的语言,下面我们以几种最常用的语言为例。

代码如何上传FTP?新手教程看这里!-图2
(图片来源网络,侵删)

第二步:使用命令行工具(无需编程)

如果你只是想在服务器上通过脚本快速上传,可以使用命令行工具,这比写一个完整程序要快。

1 Windows (PowerShell)

现代Windows系统推荐使用PowerShell。

# 设置FTP服务器信息
$ftpUrl = "ftp://ftp.yourdomain.com/path/to/upload/"
$user = "your_username"
$pass = "your_password"
$localFile = "C:\path\to\your\local\file.txt"
$remoteFile = "file_on_server.txt" # 服务器上要保存的文件名
# 创建FTP请求对象
$request = [System.Net.FtpWebRequest]::Create($ftpUrl + $remoteFile)
$request.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$request.Credentials = New-Object System.Net.NetworkCredential($user, $pass)
# 读取本地文件为字节数组
$fileContent = [System.IO.File]::ReadAllBytes($localFile)
$request.ContentLength = $fileContent.Length
# 获取请求流并写入文件内容
$requestStream = $request.GetRequestStream()
$requestStream.Write($fileContent, 0, $fileContent.Length)
$requestStream.Close()
# 获取响应
$response = $request.GetResponse()
$responseStream = $response.GetResponseStream()
$reader = New-Object System.IO.StreamReader($responseStream)
$reader.ReadToEnd()
$response.Close()

2 Linux / macOS

使用 curl 命令,非常方便。

# 设置FTP服务器信息
FTP_USER="your_username"
FTP_PASS="your_password"
FTP_SERVER="ftp.yourdomain.com"
REMOTE_PATH="/path/to/upload/"
LOCAL_FILE="/path/to/your/local/file.txt"
# 执行上传
# -u 指定用户名和密码
# -T 指定本地文件
curl -u ${FTP_USER}:${FTP_PASS} -T "${LOCAL_FILE}" "ftp://${FTP_SERVER}${REMOTE_PATH}"

第三步:使用编程语言上传文件(代码实现)

1 Python (最推荐,简洁强大)

Python的 ftplib 库是内置的,无需安装第三方库,非常方便。

代码示例 (ftp_upload.py):

import os
from ftplib import FTP
def upload_file(ftp_host, ftp_user, ftp_pass, local_path, remote_path):
    """
    上传文件到FTP服务器
    :param ftp_host: FTP服务器地址
    :param ftp_user: 用户名
    :param ftp_pass: 密码
    :param local_path: 本地文件路径
    :param remote_path: 服务器上保存的路径 (包括文件名)
    """
    try:
        # 1. 连接FTP服务器
        print(f"正在连接到 {ftp_host}...")
        ftp = FTP(ftp_host)
        ftp.login(ftp_user, ftp_pass)
        print("连接成功!")
        # 2. 检查本地文件是否存在
        if not os.path.exists(local_path):
            print(f"错误:本地文件 {local_path} 不存在!")
            return
        # 3. 上传文件
        # 使用二进制模式 'wb' (write binary) 上传文件,特别是图片、压缩包等
        print(f"正在上传 {local_path} 到 {remote_path}...")
        with open(local_path, 'rb') as file:
            ftp.storbinary(f'STOR {remote_path}', file)
        print("上传成功!")
    except Exception as e:
        print(f"上传过程中发生错误: {e}")
    finally:
        # 4. 确保连接被关闭
        if 'ftp' in locals() and ftp.sock is not None:
            ftp.quit()
            print("FTP连接已关闭。")
# --- 使用示例 ---
if __name__ == "__main__":
    # 请替换成你自己的FTP信息
    ftp_server = "ftp.yourdomain.com"
    ftp_username = "your_username"
    ftp_password = "your_password"
    # 本地文件路径
    local_file = "C:/Users/YourUser/Desktop/my_image.png"
    # 服务器上的路径 (/public_html/images/my_image.png)
    remote_file = "/public_html/images/my_image.png" 
    upload_file(ftp_server, ftp_username, ftp_password, local_file, remote_file)

如何运行:

  1. 将代码保存为 ftp_upload.py
  2. 修改 if __name__ == "__main__": 部分的变量值。
  3. 打开终端或命令提示符,进入到文件所在目录。
  4. 运行命令:python ftp_upload.py

2 Node.js (适合Web应用)

Node.js需要先安装一个FTP客户端库,basic-ftp 是一个现代、轻量且易于使用的选择。

安装库:

npm install basic-ftp

代码示例 (upload.js):

const { ftpConnect, ftpUpload } = require('basic-ftp');
const fs = require('fs');
const path = require('path');
async function uploadFile() {
    const client = new ftpConnect.Client();
    try {
        // 1. 连接FTP服务器
        console.log("正在连接到 FTP 服务器...");
        await client.access({
            host: "ftp.yourdomain.com",
            user: "your_username",
            password: "your_password",
        });
        console.log("连接成功!");
        // 2. 准备文件
        const localFilePath = "./my_document.pdf";
        const remoteFilePath = "/public_html/documents/my_document.pdf";
        // 3. 上传文件
        console.log(`正在上传 ${localFilePath} 到 ${remoteFilePath}...`);
        await client.uploadFrom(localFilePath, remoteFilePath);
        console.log("上传成功!");
    } catch (err) {
        console.error("上传过程中发生错误:", err.message);
    } finally {
        // 4. 确保连接关闭
        if (client.closed === false) {
            client.close();
            console.log("FTP连接已关闭。");
        }
    }
}
// --- 使用示例 ---
uploadFile();

如何运行:

  1. 安装 basic-ftp
  2. 修改代码中的FTP信息。
  3. 运行命令:node upload.js

3 Java (企业级应用)

Java需要使用Apache Commons Net库。

添加依赖 (Maven): 如果你使用Maven,在 pom.xml 中添加:

<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.9.0</version> <!-- 使用最新版本 -->
</dependency>

代码示例 (FtpUpload.java):

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import java.io.FileInputStream;
import java.io.IOException;
public class FtpUpload {
    public static void main(String[] args) {
        String server = "ftp.yourdomain.com";
        int port = 21;
        String user = "your_username";
        String pass = "your_password";
        String localFilePath = "C:/path/to/your/local/file.txt";
        String remoteFilePath = "/path/on/server/file.txt";
        FTPClient ftpClient = new FTPClient();
        try {
            // 1. 连接服务器
            System.out.println("正在连接到 " + server + "...");
            ftpClient.connect(server, port);
            System.out.println("连接成功,回复码: " + ftpClient.getReplyCode());
            // 2. 登录
            if (!ftpClient.login(user, pass)) {
                System.out.println("登录失败。");
                return;
            }
            System.out.println("登录成功!");
            // 3. 设置文件类型为二进制(重要!)
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            // 4. 进入远程目录(可选)
            // String remoteDir = "/public_html/";
            // ftpClient.changeWorkingDirectory(remoteDir);
            // 5. 上传文件
            System.out.println("正在上传文件...");
            try (FileInputStream fis = new FileInputStream(localFilePath)) {
                if (ftpClient.storeFile(remoteFilePath, fis)) {
                    System.out.println("文件上传成功!");
                } else {
                    System.out.println("文件上传失败,服务器回复: " + ftpClient.getReplyString());
                }
            }
        } catch (IOException e) {
            System.err.println("发生IO异常: " + e.getMessage());
        } finally {
            // 6. 断开连接
            try {
                if (ftpClient.isConnected()) {
                    ftpClient.logout();
                    ftpClient.disconnect();
                    System.out.println("FTP连接已关闭。");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

4 PHP (Web开发常用)

PHP内置了 ftp_ 系列函数,非常方便。

代码示例 (upload.php):

<?php
// FTP服务器信息
$ftp_server = "ftp.yourdomain.com";
$ftp_username = "your_username";
$ftp_password = "your_password";
// 本地和远程文件路径
$local_file = "local_image.jpg";
$remote_file = "/public_html/images/uploaded_image.jpg";
// 1. 连接FTP服务器
$conn_id = ftp_connect($ftp_server);
if ($conn_id) {
    echo "成功连接到 $ftp_server\n";
    // 2. 登录
    $login_result = ftp_login($conn_id, $ftp_username, $ftp_password);
    if ($login_result) {
        echo "登录成功!\n";
        // 3. 上传文件
        // 使用 FTP_BINARY 模式上传二进制文件(图片、压缩包等)
        if (ftp_put($conn_id, $remote_file, $local_file, FTP_BINARY)) {
            echo "文件 $local_file 成功上传到 $remote_file\n";
        } else {
            echo "上传文件时出错\n";
        }
    } else {
        echo "登录失败!请检查用户名和密码,\n";
    }
    // 4. 关闭连接
    ftp_close($conn_id);
    echo "FTP连接已关闭,\n";
} else {
    echo "无法连接到 $ftp_server\n";
}
?>

第四步:高级技巧与最佳实践

1 处理错误和异常

在上面的代码示例中,我们都使用了 try...catch (Java/Python/Node.js) 或 if 判断 (PHP) 来处理可能发生的错误(如网络中断、密码错误、文件不存在等),在实际应用中,完善的错误处理至关重要。

2 上传整个文件夹

上传文件夹需要递归地遍历本地文件夹的目录结构,并在服务器上创建对应的目录,然后逐个上传文件。

  • Python: 可以使用 os.walk() 遍历目录,使用 ftp.mkd() 创建远程目录。
  • Node.js: basic-ftp 库的 uploadFromDir() 方法可以简化这个过程。
  • Java/PHP: 同样需要先遍历本地目录,然后使用 ftp.mkd() 创建远程目录,再上传文件。

3 使用SFTP(更安全的替代方案)

强烈建议 在任何新的项目中都使用 SFTP,而不是FTP。

  • FTP: 数据(包括用户名和密码)都是明文传输的,非常不安全。
  • SFTP: 基于SSH协议,所有数据都是加密传输的,安全得多。

大多数代码库都支持SFTP,通常只是将连接方式从 FTP 改为 SFTPSSH

  • Python: 使用 paramikopysftp 库。
  • Node.js: 使用 ssh2-sftp-client 库。
  • Java: 使用 JSch 库。
  • PHP: 使用 ssh2 扩展(需要服务器安装并启用)。

4 关于FTP用户权限

为FTP程序创建一个专用的用户,并给予其最小的必要权限(只允许上传到指定目录,不允许浏览或修改其他目录),这样可以提高安全性。


总结与建议

语言 推荐库/方法 优点 缺点
Python ftplib (内置) 简洁、易读、功能强大
Node.js basic-ftp 现代、轻量、Promise支持好 需要安装第三方库
Java Apache Commons Net 稳定、功能全面、适合企业级项目 代码相对冗长
PHP ftp_* 函数 (内置) 与Web开发无缝集成 功能相对基础

给初学者的建议:

  1. 先测试连接: 无论如何,先用FileZilla等客户端工具确保你能连上服务器。
  2. 从Python开始: 如果你不确定用什么语言,Python的 ftplib 是最容易上手和理解的。
  3. 优先考虑SFTP: 如果你的服务器支持,请务必使用SFTP来保护你的数据安全。
  4. 注意文件模式: 上传文本文件(如 .txt, .html)可以用ASCII模式,但上传图片、视频、压缩包等必须使用二进制模式,否则文件会损坏。
分享:
扫描分享到社交APP
上一篇
下一篇