ftp上传图片,在windows上没有问题,在linux上就上传失败

我出现这个问题的原因是:根目录下创建了两层目录,在windows上没有问题,但是在linux中,创建第二层目录时失败了。
出错时代码:

boolean saveldhtzp = FtpUtils.upload(systemType,
	ftpHost,
	Integer.valueOf(ftpPort),
    ftpUser, 
    ftpPwd,
   "ldhtzp/",
   personInfoBean.getProjectId()+"/"+personInfoBean.getPersonId(), 
   new ByteArrayInputStream(file[i].getBytes()),    															   																																																																																																																								personInfoBean.getPersonId()+picName+".jpg");                                             `

代码注释:ldhtzp是创建的根目录,personInfoBean.getProjectId()是创建的第一层目录,personInfoBean.getPersonId()是创建的第二层目录
解决问题:去掉第二层目录即可
修改后代码:

boolean saveldhtzp = FtpUtils.upload(systemType,
   ftpHost, Integer.valueOf(ftpPort),
   ftpUser,
   ftpPwd,
   "ldhtzp/",
   personInfoBean.getProjectId(),
   new ByteArrayInputStream(file[i].getBytes()), personInfoBean.getPersonId()+picName+".jpg");

下面是FtpUtils中upload方法代码

/**
 * ftp上传单个文件
 * 
 * @param ftpUrl
 *            ftp地址
 * @param userName
 *            ftp的用户名
 * @param password
 *            ftp的密码
 * @param directory
 *            上传至ftp的路径名不包括ftp地址
 * @param is
 *            要上传的文件流
 * @param destName
 *            上传至ftp后存储的文件名
 * @throws IOException
 */
public static boolean upload(String systemType,String ftpUrl, int port, String userName, String password, String directory,
		String newDirectory, InputStream is, String destName) throws IOException {
	FTPClient ftpClient = new FTPClient();
	boolean result = false;
	try {
		ftpClient.connect(ftpUrl, port);
		boolean login = ftpClient.login(userName, password);
		if(!login){
			System.out.println("login"+login);
			return login;
		}
		// 设置文件类型(二进制)
		ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
		
		if("1".equals(systemType)){
			ftpClient.enterLocalPassiveMode();  //linux系统注释掉
		}
		// 设置根目录
		boolean changeWorkingDirectory = ftpClient.changeWorkingDirectory(directory);
		if(!changeWorkingDirectory){
			System.out.println("changeWorkingDirectory"+changeWorkingDirectory);
			return changeWorkingDirectory;
		}
		ftpClient.setBufferSize(1024);
		ftpClient.setControlEncoding("gbk");
		// 创建新目录
		ftpClient.makeDirectory(newDirectory);
		// 设置上传目录
		boolean changeWorkingDirectory2 = ftpClient.changeWorkingDirectory(newDirectory);
		if(!changeWorkingDirectory2){
			System.out.println("changeWorkingDirectory2"+changeWorkingDirectory2);
			return changeWorkingDirectory2;
		}
		result = ftpClient.storeFile(destName, is);
		return result;
	} catch (NumberFormatException e) {
		System.out.println("FTP端口配置错误:不是数字:");
		throw e;
	} catch (FileNotFoundException e) {
		throw new FileNotFoundException();
	} catch (IOException e) {
		throw new IOException(e);
	} finally {
		try {
			ftpClient.disconnect();
		} catch (IOException e) {
			throw new RuntimeException("关闭FTP连接发生异常!", e);
		}
	}
}

原因:linux环境中ftp只能一级一级的创建目录,不可一次创建多级目录,而windows环境中一次是可以创建多级目录的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用 Python 中的 ftplib 模块来实现这个功能。 以下是一个简单的示例代码: ``` import ftplib ftp = ftplib.FTP("ftp.example.com") ftp.login("username", "password") ftp.cwd("/") filename = "file.txt" ftp.retrbinary("RETR " + filename, open(filename, "wb").write) ftp.quit() ``` 需要注意的是,在这个示例代码中,需要将 `ftp.example.com` 替换为您的 FTP 服务器的地址,`username` 和 `password` 替换为您的 FTP 账户的用户名和密码。另外,如果要从 LinuxWindows 传输文件,您需要确保您的 FTP 服务器正在运行并且可以被连接。 ### 回答2: 在Python中使用ftplib库可以轻松实现通过FTPLinuxWindows传输文件的功能。以下是一个简单的示例代码: ```python import ftplib def ftp_transfer(source_path, destination_path, hostname, username, password): try: # 连接FTP服务器 ftp = ftplib.FTP(hostname) ftp.login(username, password) # 切换到目标目录 ftp.cwd(destination_path) # 以二进制模式打开本地文件 with open(source_path, 'rb') as file: # 将文件上传到服务器 ftp.storbinary('STOR ' + destination_path, file) ftp.quit() print("文件传输成功") except ftplib.all_errors as e: print("文件传输失败:", e) # 调用函数进行文件传输 source_path = "/path/to/source/file.txt" destination_path = "/path/to/destination/file.txt" hostname = "FTP服务器IP地址" username = "FTP登录用户名" password = "FTP登录密码" ftp_transfer(source_path, destination_path, hostname, username, password) ``` 请注意将示例中的 `source_path`、`destination_path`、`hostname`、`username`和`password` 替换为实际的值。示例中的代码连接到FTP服务器,将本地的`source_path`文件传输到FTP服务器的`destination_path`路径下。 ### 回答3: 当使用Python与FTP协议进行文件传输时,我们需要使用ftplib库。下面是一个使用ftplib库实现从LinuxWindows传输文件的示例代码: ```python import ftplib def transfer_file(hostname, username, password, source_file, destination_file): # 建立FTP连接 ftp = ftplib.FTP(hostname) ftp.login(username, password) # 初始化传输模式为二进制 ftp.set_pasv(True) # 打开本地文件作为二进制读取 with open(source_file, 'rb') as file: # 上传文件到FTP服务器 ftp.storbinary('STOR ' + destination_file, file) # 关闭FTP连接 ftp.quit() # 使用示例 hostname = 'ftp.example.com' # FTP服务器的地址 username = 'your_username' # FTP登录用户名 password = 'your_password' # FTP登录密码 source_file = '/path/to/local/file.txt' # 本地文件路径 destination_file = '/path/to/remote/file.txt' # 远程文件路径 transfer_file(hostname, username, password, source_file, destination_file) ``` 在上面的代码中,我们首先使用ftplib库建立与FTP服务器的连接,然后登录服务器并设置传输模式为二进制。接下来,我们打开本地文件作为二进制文件,并使用FTP的storbinary()方法将文件上传FTP服务器上的指定路径。最后,我们关闭与FTP服务器的连接。 请注意,以上示例仅适用于LinuxWindows操作系统传输文件。如果需要进行其他类型的文件传输,请根据具体需求进行相应的代码修改。另外,在实际使用中,还应该添加适当的错误处理和异常捕获机制来保证操作的稳定性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值