关于搭建ftp服务器这里就不赘述了,网上教程很简单。
该代码重要用到了两个包,主要用到了commons-net-3.6.jar这个包,用这个创建ftpclient对象,并操作这个对象完成文件上传
@Test
public void test1(){
try {
FileInputStream in=new FileInputStream(new File("E:/新建文件夹 (2)/timg1.jpg"));
Map<String, Object> map = uploadFile("127.0.0.1", 21, "lqt1", "lqt", "dsa", "tim.jpg", in);
System.out.println(map.get("status")+"====>"+map.get("filepath"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
/**
* Description: 向FTP服务器上传文件
* @param url FTP服务器hostname
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param path FTP服务器保存目录
* @param filename 上传到FTP服务器上的文件名
* @param input 输入流
* @return 成功返回true,否则返回false
*/
public static Map<String, Object> uploadFile(String url,int port,String username, String password, String path, String filename, InputStream input) {
boolean success = false;
Map<String, Object> map = new HashMap<String,Object>();
String filepath="";
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(url, port);//连接FTP服务器
//如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
ftp.login(username, password);//登录
reply = ftp.getReplyCode();
//判断reply的code是否正常,一般正常为2开头的code
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
map.put("status", success);
map.put("filepath", filepath);
return map;
}
boolean a = ftp.changeWorkingDirectory("/");
System.out.println("转换目录结果1:"+a);
if(StringUtils.isBlank(path) || path.equals("/")){//如果输入的路径为空或者为根路径,则不转换操作目录
}else{//否则创建想要上传文件的目录,并且将操作目录转为新创建的目录
ftp.makeDirectory(path);
boolean b = ftp.changeWorkingDirectory(path);
System.out.println("转换目录结果2:"+b);
}
//ftp上传文件是以文本形式传输的,所以多媒体文件会失真,需要转为二进制形式传输
ftp.setFileType(FTP.BINARY_FILE_TYPE);
//转码后可以文件名可以为中文
ftp.storeFile(new String(filename.getBytes("GBK"), "iso-8859-1"), input);
input.close();
ftp.logout();
success = true;
filepath = "ftp://"+url+":"+port+"/"+path+"/"+filename;
map.put("status", success);
map.put("filepath", filepath);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (Exception ioe) {
}
}
}
return map;
}
步骤:1,创建连接。2.输入用户名密码。3..指定操作目录。4.确定上传路径。5.确定上传文件名。
在写这个方法的时候遇到三个问题:
问题1:.多媒体文件上传后,打开文件失真,图片显示不全或者音乐声音都是杂音。
解决办法:这是由于ftp在上传是是用文本格式传输的,需要把这个转换为二进制的流进行传输,就ok了。
主要代码:ftp.setFileType(FTP.BINARY_FILE_TYPE);
问题2:上传的文件在生成时如果使用中文名,会出现上传失败的情况.
解决办法:这个是因为ftp的编码是iso-8859-1的,将生成文件的文件名进行转码即可。
主要代码:ftp.storeFile(new String(filename.getBytes("GBK"), "iso-8859-1"), input);
问题3:这个是耗费我时间最长的问题。上传是只能将文件上传至服务器的根路径,无法上传至我生成的目录下,甚至我自己手动新建的文件夹也不行,并且权限配置都没有问题。
解决办法:这个的原因是主要是因为操作目录的问题和创建文件夹的方法有问题。首先需要将操作目录转到想要生成的文件夹的父级目录,我的就是根目录‘/’;之后再这个目录下再创建文件夹,在创建文件夹时,我一开始使用的时File对象操作,但是后来发现无法实现, 之后看文档发现ftp可以自己有创建目录的方法,直接使用ftp的ftp.makeDirectory()方法就可以创建目录,创建目录之后,再将操作目录转到新创建的这个目录就可以实现上传到该目录下的操作了。
主要代码:boolean a = ftp.changeWorkingDirectory("/");
System.out.println("转换目录结果1:"+a);
if(StringUtils.isBlank(path) || path.equals("/")){//如果输入的路径为空或者为根路径,则不转换操作目录
}else{//否则创建想要上传文件的目录,并且将操作目录转为新创建的目录
ftp.makeDirectory(path);
boolean b = ftp.changeWorkingDirectory(path);
System.out.println("转换目录结果2:"+b);
}
ps:代码还有地方需要完善,上传文件的后缀名现在是写死的,需要自动识别出后缀名才行。