Web开发时常会遇到需要用户上传文件,并且把文件保存下来。
通常来说我们不会把文件存放在与Tomcat同一个服务器中,而是有一个专门的文件服务器存放文件。
如何将文件保存到文件服务器中,这时候可以选择使用FTP将文件传输到专门的服务器。
使用FTP传输文件,我们所需要的只是一个jar包,文件服务器我选择的是Ubuntu
基本上所有的操作都基于 FTPClient 这个类的对象,
将文件上传到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);