java 通过FTP上传与下载文件

1 篇文章 0 订阅

Web开发时常会遇到需要用户上传文件,并且把文件保存下来。

通常来说我们不会把文件存放在与Tomcat同一个服务器中,而是有一个专门的文件服务器存放文件。

如何将文件保存到文件服务器中,这时候可以选择使用FTP将文件传输到专门的服务器。

使用FTP传输文件,我们所需要的只是一个jar包,文件服务器我选择的是Ubuntu

基本上所有的操作都基于 FTPClient 这个类的对象,

将文件上传到FTP服务器有一个需要注意的地方就是文件名的编码问题,如果编码格式不对,服务器里面会显示乱码。

现在开始介绍如何通过FTP上传与下载文件。

登录FTP服务器

        //创建FTP客户端,所有的操作都基于FTPClinet
		FTPClient ftp = new FTPClient();
		
		//连接FTP服务器
		ftp.connect("192.168.218.133");
		
		//如果是需要认证的服务器,就需要账号和密码来登录
		ftp.login("username", "password");
		
		//获取服务器返回的状态码
		int reply = ftp.getReplyCode();
		System.out.println(reply);
		
		/*
		 * 判断是否连接成功
		 * 所有以2开头的代码是正完成响应。
		 * FTP服务器将在最终发送一个肯定的完成响应成功完成命令。
		 */
		if (!FTPReply.isPositiveCompletion(reply)) {
			ftp.disconnect();
			System.out.println("连接失败");
			return;
		}
		System.out.println("连接成功");

切换文件夹

ftpClient.changeWorkingDirectory("/ftp");

创建文件夹

我想将文件存放到/ftp/images里面,首先要创建这个文件

//返回一个布尔类型的值,来表示是否创建成功
boolean isCreate = ftpClient.makeDirectory("/ftp/images");

上传文件

//设置文件上传类型
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

//获取文件的输入流
FileInputStream fis = new FileInputStream("e:/1.jpg");

//调用storeFile方法将文件上传到FTP服务器
//第一个参数是上传到服务器的路径,包含了文件名
boolean isUpload = ftpClient.storeFile("/ftp/images/upload.jpg", fis);

遍历当前文件夹

FTPFile[] list = ftpClient.listFiles();
for (FTPFile ftpFile : list) {
	System.out.println("name: " + ftpFile.getName());
	System.out.println("group: " + ftpFile.getGroup());
	System.out.println("RwaListing: " + ftpFile.getRawListing());
	System.out.println("size: " + ftpFile.getSize());
	System.out.println("type: " + ftpFile.getType());
	System.out.println("user: " + ftpFile.getUser());
	System.out.println("timestamp: " + ftpFile.getTimestamp());
	System.out.println("class: " + ftpFile.getClass());

}

输入如下图所示

下载文件

FileOutputStream fos = new FileOutputStream("e:/upload.jpg");
boolean isDown = ftpClient.retrieveFile("/ftp/images/upload.jpg", fos);

调用retrieveFile,第一个参数是你要下载的图片的路径,第二个参数是处理文件的输出流,可以通过输出流将文件保存到本地,也可以响应到浏览器中。

注意事项:

1.调用storeFile前需要设置文件上传的类型,不然文件上传到服务器可能会出现文件损坏的情况

类型是FTP类下的一些静态成员变量

由于这里用的是字节流上传,所有选择 BINARY_FILE_TYPE 即可

2.文件名编码问题

如果你上传的文件名是中文的,那么很大可能在服务器里面会显示乱码,这是由于服务器的编码与我们字节码的编码不一致导致的。

解决方法是将文件服务器编码修改为UTF-8,或者将文件名重新编码一遍,再传给storeFile

String path = new String("/ftp/images/这是一张图片.jpg".getBytes("UTF-8"),"ISO-8859-1");
boolean isUpload = ftpClient.storeFile(path, fis);

3.权限问题

由于账号权限的问题,你创建的文件夹与上传的文件的权限可能都是700,这样会导致文件无法读取。这时候需要手动设置文件的权限。

//设置文件权限 
boolean isSet = ftp.sendSiteCommand("chmod 744 " + path);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值