问题描述:通常应用服务器与文件服务器分别在不同的机器上,涉及到文件的上传与下载。通过建立网络映射盘的形式,将文件服务器保存文件的文件夹映射到应用服务器的某个盘符下,经过试验,在tomcat下两台笔记本是可以实现的,但是在生产环境的websphere下试验,经过多番尝试,仍然实现不了。
问题分析:采用FTP的方式实现文件的上传与下载功能,在Java代码中编写客户端的上传与下载,在文件服务器上,直接装一个FTP服务器软件即可。注意生产环境的防火墙以及客户是否允许使用FTP。
解决方案:
- 工程中导入JAR包;(见附件)
- 编写客户端FTP类;
- 服务器安装FTP服务器软件,并配置文件夹;(详见附件文档中说明)
package com.common.util;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
/**
* 处理文件上传下载的工具类
* @author Administrator
*
*/
publicclass FtpUtils {
/**
* 连上ftp 服务器
* @param path FTP服务器保存目录
* @param addr FTP服务器hostname
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @return
* @throws Exception
*/
publicstatic FTPClient connect(String path,String addr,int port,String username,String password) throws Exception {
FTPClient ftp = new FTPClient();
int reply;
ftp.connect(addr,port);
ftp.login(username,password);
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
returnnull;
}
ftp.changeWorkingDirectory(path);
return ftp;
}
/**
* 上传文件
* @param file 上传到FTP服务器上的文件路径
* @param ftp
* @throws Exception
*/
publicstaticvoid upload(FTPClient ftp,File file) throws Exception{
if(file.isDirectory()){
ftp.makeDirectory(file.getName());
ftp.changeWorkingDirectory(file.getName());
String[] files = file.list();
for (int i = 0; i < files.length; i++) {
File file1 = new File(file.getPath()+"\\"+files[i] );
if(file1.isDirectory()){
upload(ftp,file1);
ftp.changeToParentDirectory();
}else{
File file2 = new File(file.getPath()+"\\"+files[i]);
FileInputStream input = new FileInputStream(file2);
ftp.storeFile(file2.getName(), input);
input.close();
}
}
}else{
File file2 = new File(file.getPath());
FileInputStream input = new FileInputStream(file2);
ftp.storeFile(file2.getName(), input);
input.close();
}
}
/**
* 文件下载
* @param ftp
* @param remoteFileName FTP服务器上的文件名称
* @param localFileName 下载后保存到本地的文件路径
* @throws IOException
*/
publicstaticvoid download(FTPClient ftp,String remoteFileName, String localFileName) throws IOException {
boolean flag = true;
// 下载文件
BufferedOutputStream buffOut = null;
try {
buffOut = new BufferedOutputStream(new FileOutputStream(localFileName));
flag = ftp.retrieveFile(remoteFileName, buffOut);
if(!flag)
thrownew IOException("下载过程发生异常。");
} finally {
try {
if (buffOut != null)
buffOut.close();
} catch (Exception e) {
//e.printStackTrace();
}
}
}
/**
* 断开连接
* @param ftp
*/
publicstaticvoid disconnect(FTPClient ftp) {
try {
ftp.disconnect();
} catch (IOException e) {
//
}
}
/**
* @Test测试文件上传与下载
* @param args
*/
publicstaticvoid main(String args[]) {
FTPClient ftpClient;
try {
//与服务器连接
ftpClient = FtpUtils.connect("D:/inner","127.0.0.1",21,"test","test");
//上传文件
File file = new File("D:/test.txt");
FtpUtils.upload(ftpClient,file);
file.delete();
//下载文件
FtpUtils.download(ftpClient,"test.txt","E:/test.txt");
//断开连接
FtpUtils.disconnect(ftpClient);
} catch (Exception e) {
System.out.println("ftp文件上传(或下载)失败!");
e.printStackTrace();
}
}
}
//注意相关配置最好写到配置文件中。