java FTP上传文件问题

一定要看到最后避免吃亏

本地测试FTP文件上传没问题

例子:
FTP 上传

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;

public class FTPUploader {

    public static void main(String[] args) {
        String server = "ftp.example.com";
        int port = 21;
        String user = "your-ftp-username";
        String password = "your-ftp-password";

        FTPClient ftpClient = new FTPClient();
        try {
            ftpClient.connect(server, port);
            ftpClient.login(user, password);
            ftpClient.enterLocalPassiveMode();

            File localFile = new File("path-to-local-file");
            String remoteFile = "path-to-remote-file";
            FileInputStream inputStream = new FileInputStream(localFile);

            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            ftpClient.storeFile(remoteFile, inputStream);

            inputStream.close();
            ftpClient.logout();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

本地测试FTP文件下载

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class FTPDownloader {

    public static void main(String[] args) {
        String server = "ftp.example.com";
        int port = 21;
        String user = "your-ftp-username";
        String password = "your-ftp-password";

        FTPClient ftpClient = new FTPClient();
        try {
            ftpClient.connect(server, port);
            ftpClient.login(user, password);
            ftpClient.enterLocalPassiveMode();

            String remoteFile = "path-to-remote-file";
            File localFile = new File("path-to-local-file");
            OutputStream outputStream = new FileOutputStream(localFile);

            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            ftpClient.retrieveFile(remoteFile, outputStream);

            outputStream.close();
            ftpClient.logout();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

java 操作linux间ftp上传压缩包

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;

import java.io.*;

public class FTPUploadExample {
    public static void main(String[] args) {
        String server = "your_ftp_server";
        int port = 21;
        String username = "your_ftp_username";
        String password = "your_ftp_password";
        String localFilePath = "path_to_local_file";
        String remoteDirectory = "path_to_remote_directory";
        String compressedFileName = "compressed_file.zip";

        FTPClient ftpClient = new FTPClient();
        try {
            // 连接到FTP服务器
            ftpClient.connect(server, port);
            ftpClient.login(username, password);

            // 设置上传文件的类型为二进制
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

            // 将工作目录切换到远程目录
            ftpClient.changeWorkingDirectory(remoteDirectory);

            // 创建一个压缩包文件
            File compressedFile = new File(compressedFileName);
            FileOutputStream fos = new FileOutputStream(compressedFile);
            ZipOutputStream zipOut = new ZipOutputStream(fos);

            // 添加需要上传的文件到压缩包中
            File file = new File(localFilePath);
            FileInputStream fis = new FileInputStream(file);
            ZipEntry zipEntry = new ZipEntry(file.getName());
            zipOut.putNextEntry(zipEntry);
            byte[] bytes = new byte[1024];
            int length;
            while ((length = fis.read(bytes)) >= 0) {
                zipOut.write(bytes, 0, length);
            }
            fis.close();
            zipOut.close();
            fos.close();

            // 上传压缩包文件到FTP服务器
            FileInputStream compressedFileInputStream = new FileInputStream(compressedFile);
            ftpClient.storeFile(compressedFileName, compressedFileInputStream);
            compressedFileInputStream.close();

            // 删除本地的压缩包文件
            compressedFile.delete();

            System.out.println("文件上传成功!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                // 断开与FTP服务器的连接
                ftpClient.logout();
                ftpClient.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

问题:文件可以上传到指定的路径下 但是压缩包的大小为0 代码没错、ftp账户密码没错、路径没错、原压缩包正常

在不确定且无法查看ftp服务器详细配置的情况下

当时使用的语句是:ftpClient.enterLocalActiveMode();

应当使用的语句是:ftpClient.enterLocalPassiveMode();

原因:

1.ftpClient.enterLocalActiveMode()是FTP客户端库中的一个方法,用于设置FTP客户端的数据传输模式为主动模式。主动模式意味着在建立数据连接时,FTP客户端会选择一个随机的端口,并将该端口告知FTP服务器,在该端口上进行数据传输。

2.主动模式在一些特定情况下可能会导致一些问题:
1)防火墙限制:在主动模式下,FTP服务器需要建立与客户端的数据连接,这可能需要打开特定的端口。如果FTP服务器位于一个防火墙后面,防火墙可能会限制对这些端口的访问,导致数据连接失败。
2)客户端位置限制:主动模式下,FTP服务器将从客户端随机选择一个端口进行数据传输。如果客户端位于一个受限网络环境中(例如企业内部网络),可能会限制对这些随机端口的访问。

3、为了克服这些问题,还有一种被动模式(PASV)可供选择。在被动模式下,FTP客户端将发送一个PASV命令到FTP服务器,要求服务器在特定的端口上监听数据连接。然后,FTP客户端会连接到该端口进行数据传输。被动模式通常是更常用和更可靠的选择,因为它不依赖于客户端的随机端口访问。
1)要将FTP客户端设置为被动模式,可以使用以下代码: ftpClient.enterLocalPassiveMode();

这样可以确保在FTP交互中更好地工作,并有助于跨网络和防火墙进行数据传输。

其他问题假设:

确认代码、FTP账户密码、路径以及原压缩包都是正确的,但上传到服务器后压缩包大小为0,这可能是由于服务器方面的问题导致的。以下是一些可能的原因和解决方案:

1.服务器限制:检查一下服务器是否设置了限制文件大小的规定。某些服务器可能限制上传文件的大小,如果超过了限制,上传的文件可能会被截断导致大小为0。联系你的服务器管理员,了解服务器的规定并确定是否有限制。

2.服务器存储空间不足:确保服务器的存储空间足够大,可以容纳上传的压缩包。如果服务器存储空间不足,压缩包可能无法完整地上传。

3.服务器设置问题:服务器可能存在一些特殊的设置或配置,导致文件无法正常上传。与服务器管理员联系,确认服务器的设置是否支持文件上传。

4.服务器文件权限问题:检查一下上传路径的文件权限设置,确保你有足够的权限在该路径下写入文件。试着将文件上传到其他路径,看是否仍然出现大小为0的问题。

5.压缩包读取错误:在读取压缩包文件时出现了错误。请确保你正常地从本地读取压缩包文件,并在上传之前确认其大小。

6.压缩包传输模式错误:如果你使用了FTP来传输文件,可以尝试使用二进制模式进行传输,以确保压缩包能够正确地被上传。

7.压缩包本身问题:检查一下压缩包文件是否正确,可能存在压缩包文件损坏的情况。你可以尝试重新创建一个压缩包,然后再次上传。

8.编码问题:在处理压缩包文件时,确保使用正确的字符编码方式,以避免文件内容解析出错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值