维护一个旧项目(eJMS),先前从JDK1.3升级到1.5,后来还要从FTP转换到SFTP
转SFTP用了一个开源的jftp.jar包支持,download的代码
public byte[] downloadFile(String remoteDir, String fileName){
Session session;
Channel channel;
JSch jsch = new JSch();
try {
session = jsch.getSession(this.userName, this.hostName, this.port);
System.out.println("Get Session : " + session);
session.setPassword(password);
System.out.println("set password ... ");
session.setUserInfo(defaultUserInfo);
System.out.println("set user info ... ");
session.connect();
System.out.println("connected session : sftp://" + this.hostName + ":" + this.port);
channel = session.openChannel("sftp");
System.out.println("opened channel ... ");
channel.connect();
System.out.println("connected channel ... ");
ChannelSftp c = (ChannelSftp)channel;
System.out.println("remoted channel ... ");
c.cd(remoteDir);
Vector getFile = new Vector();
InputStream in = c.get(fileName);
int length = 0;
int totalLength = 0;
byte[] buffer = new byte[1024];
while ((length = in.read(buffer)) > 0){
byte[] tmpBuffer = new byte[length];
System.arraycopy(buffer, 0, tmpBuffer, 0, length);
getFile.addElement(tmpBuffer);
totalLength = totalLength + length;
}
in.close();
byte[] result = new byte[totalLength];
int pos = 0;
for (int i = 0; i < getFile.size(); i ++){
byte[] tmpBuffer = (byte[])getFile.elementAt(i);
System.arraycopy(tmpBuffer, 0, result, pos, tmpBuffer.length);
pos = pos + tmpBuffer.length;
}
getFile.clear();
System.out.println("downloaded file '" + remoteDir + "\\" + fileName + "'");
c.disconnect();
System.out.println("disconnected channel ... ");
session.disconnect();
System.out.println("disconnected session ... ");
return result;
} catch (JSchException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SftpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
调用download的方法
public byte[] getFile(String server, String user, String pwd, String tar_dir, String filename) {
if(server!=null && user != null && pwd!=null) {
SFtp sftp = new SFtp(server, user, pwd);
return sftp.downloadFile(tar_dir, filename);
} else {
return null;
}
}
上传的代码
public boolean uploadFile(String remoteDir, String fileName, byte[] data){
Session session;
Channel channel;
JSch jsch = new JSch();
try {
session = jsch.getSession(this.userName, this.hostName, this.port);
System.out.println("Get Session : " + session);
session.setPassword(password);
System.out.println("set password ... ");
session.setUserInfo(defaultUserInfo);
System.out.println("set user info ... ");
session.connect();
System.out.println("connected session : sftp://" + this.hostName + ":" + this.port);
channel = session.openChannel("sftp");
System.out.println("opened channel ... ");
channel.connect();
System.out.println("connected channel ... ");
ChannelSftp c = (ChannelSftp)channel;
System.out.println("remoted channel ... ");
c.cd(remoteDir);
OutputStream out = c.put(fileName);
int length = data.length;
out.write(data, 0, length);
out.flush();
out.close();
System.out.println("uploaded file to '" + remoteDir + "\\" + fileName + "'");
c.disconnect();
System.out.println("disconnected channel ... ");
session.disconnect();
System.out.println("disconnected session ... ");
return true;
} catch (JSchException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SftpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
调用上传的方法的部分代码
public int getUploadFile(HttpServletRequest request, int maxSize){
maxsize = maxSize;
int length=0;
try {
// Setup incoming data
multi = new MultipartRequest(request, 1024*1024*10);
int flength = multi.checkFileSize();
// check file's length
if(flength > (maxSize * 1024)){
return -1;
}
multi.getFileData();
Hashtable all=multi.getAllFile();
Enumeration files = all.elements();
while(files.hasMoreElements()) {
UploadedFile up = (UploadedFile)files.nextElement();
// upload file must be *.doc
if (!up.getFilesystemName().toLowerCase().endsWith(".doc")){
return -2;
}
byte[] data = up.getData();
log(server+", "+user+","+pwd+","+tar_dir+","+filename);
SFtp sftp = new SFtp(server, portNo, user, pwd);
if (sftp.uploadFile(tar_dir, filename, data) == true){
length = length + data.length;
}else{
log("ftp file error:" + filename);
}
}
} catch (Exception e) {
log(e, "upload error");
return 0;
}
return length;
}
上传的时候直接call JavaBean就可以了
下载的时候由于返回的是byte[],所以call JavaBean之后还需要返回给客户端
ServletOutputStream outs = response.getOutputStream();
outs.write(data);
outs.flush();
outs.close();
这里还要注意一个问题,当你引入一些package或者其他定义之类的代码,它们之间不可以存在有空格
比如这样没有问题
<%%><%%><%
...
%>
但是如果是
<%%>
<%
...
%>
就会抛出异常
2008-5-6 15:17:01 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
....
这个问题我是不怎么好理解...