一定要看到最后避免吃亏
本地测试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.编码问题:在处理压缩包文件时,确保使用正确的字符编码方式,以避免文件内容解析出错。