首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

SFTP下传和上载

2012-11-22 
SFTP上传和下载维护一个旧项目(eJMS),先前从JDK1.3升级到1.5,后来还要从FTP转换到SFTP转SFTP用了一个开源

SFTP上传和下载

维护一个旧项目(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 blocke.printStackTrace();} catch (SftpException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();} catch (SftpException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return false;}

?调用上传的方法的部分代码

public int getUploadFile(HttpServletRequest request, int maxSize){ maxsize = maxSize;int length=0;try {        // Setup incoming datamulti = new MultipartRequest(request, 1024*1024*10);int flength = multi.checkFileSize();    // check file's lengthif(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

....

?

这个问题我是不怎么好理解...SFTP下传和上载

package xxx;import java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;public class MultipartRequest { private static final int DEFAULT_MAX_POST_SIZE = 1024 * 1024; // 1 Meg protected Hashtable parameters = new Hashtable(); // name - Vector of values Hashtable files = new Hashtable(); // name - UploadedFile MultipartParser parser; String file_name="";HttpServletRequest http_request;int max_post_size; public MultipartRequest(HttpServletRequest request, String saveDirectory) throws IOException { this(request, saveDirectory, DEFAULT_MAX_POST_SIZE, null); } public MultipartRequest(HttpServletRequest request, String saveDirectory, int maxPostSize, String fname) throws IOException { // Sanity check values if (request == null) throw new IllegalArgumentException("request cannot be null"); if (saveDirectory == null) throw new IllegalArgumentException("saveDirectory cannot be null"); if (maxPostSize <= 0) { throw new IllegalArgumentException("maxPostSize must be positive"); } // Save the dir File dir = new File(saveDirectory); // Check saveDirectory is truly a directory if (!dir.isDirectory()) throw new IllegalArgumentException("Not a directory: " + saveDirectory); // Check saveDirectory is writable if (!dir.canWrite()) throw new IllegalArgumentException("Not writable: " + saveDirectory); // Parse the incoming multipart, storing files in the dir provided, // and populate the meta objects which describe what we found MultipartParser parser = new MultipartParser(request, maxPostSize, fname); http_request = request;max_post_size=maxPostSize; Part part; while ((part = parser.readNextPart()) != null) { String name = part.getName(); if (part.isParam()) { // It's a parameter part, add it to the vector of values ParamPart paramPart = (ParamPart) part; String value = paramPart.getStringValue(); Vector existingValues = (Vector)parameters.get(name); if (existingValues == null) { existingValues = new Vector(); parameters.put(name, existingValues); } existingValues.addElement(value); } else if (part.isFile()) { // It's a file part FilePart filePart = (FilePart) part; String fileName = filePart.getFileName(); if (fileName != null) { // The part actually contained a file filePart.writeTo(dir); files.put(name, new UploadedFile( dir.toString(), fileName, filePart.getContentType()));file_name=fileName; } else { // The field did not contain a file files.put(name, new UploadedFile(null, null, null)); } } } } public MultipartRequest(HttpServletRequest request, int maxPostSize) throws IOException { // Sanity check values if (request == null) throw new IllegalArgumentException("request cannot be null"); if (maxPostSize <= 0) { throw new IllegalArgumentException("maxPostSize must be positive"); } // Parse the incoming multipart, storing files in the dir provided, // and populate the meta objects which describe what we found parser = new MultipartParser(request, maxPostSize, null); http_request = request;max_post_size=maxPostSize;}public int checkFileSize(){String err="";HttpServletRequest req=http_request; String type = null; String type1 = req.getHeader("Content-Type"); String type2 = req.getContentType(); // If one value is null, choose the other value if (type1 == null && type2 != null) { type = type2; } else if (type2 == null && type1 != null) { type = type1; } // If neither value is null, choose the longer value else if (type1 != null && type2 != null) { type = (type1.length() > type2.length() ? type1 : type2); } if (type == null || !type.toLowerCase().startsWith("multipart/form-data")) { err="Posted content type isn't multipart/form-data"; } // Check the content length to prevent denial of service attacks int length = req.getContentLength(); if (length > max_post_size) { err="File size of " + length + " exceeds limit of " + max_post_size; }return length;}public Hashtable getAllFile() throws Exception{return files;}public int getFileData() throws IOException {byte[] buf=null;int num=0; Part part;long l=0; while ((part = parser.readNextPart()) != null) { String name = part.getName(); if (part.isFile()) {num=num+1; // It's a file part FilePart filePart = (FilePart) part; String fileName = filePart.getFileName(); if (fileName != null) { // The part actually contained a file buf=filePart.getFile();int length = (int)buf.length;//byte[] data=new byte[length];//System.arraycopy(data, 0, buf,0,length); //files.put(name, new UploadedFile( " ", fileName, filePart.getContentType(),data)); files.put(fileName, new UploadedFile( "dir", fileName, filePart.getContentType(),buf));file_name=fileName; } } }return num; } /** * Constructor with an old signature, kept for backward compatibility. * Without this constructor, a servlet compiled against a previous version * of this class (pre 1.4) would have to be recompiled to link with this * version. This constructor supports the linking via the old signature. * Callers must simply be careful to pass in an HttpServletRequest. * */ public MultipartRequest(ServletRequest request, String saveDirectory) throws IOException { this((HttpServletRequest)request, saveDirectory); } /** * Constructor with an old signature, kept for backward compatibility. * Without this constructor, a servlet compiled against a previous version * of this class (pre 1.4) would have to be recompiled to link with this * version. This constructor supports the linking via the old signature. * Callers must simply be careful to pass in an HttpServletRequest. * */ public MultipartRequest(ServletRequest request, String saveDirectory, int maxPostSize) throws IOException { this((HttpServletRequest)request, saveDirectory, maxPostSize, null); } /** * Returns the names of all the parameters as an Enumeration of * Strings. It returns an empty Enumeration if there are no parameters. * * @return the names of all the parameters as an Enumeration of Strings. */ public Enumeration getParameterNames() { return parameters.keys(); } /** * Returns the names of all the uploaded files as an Enumeration of * Strings. It returns an empty Enumeration if there are no uploaded * files. Each file name is the name specified by the form, not by * the user. * * @return the names of all the uploaded files as an Enumeration of Strings. */ public Enumeration getFileNames() { return files.keys(); } public String getFileName() { return file_name; } /** * Returns the value of the named parameter as a String, or null if * the parameter was not sent or was sent without a value. The value * is guaranteed to be in its normal, decoded form. If the parameter * has multiple values, only the last one is returned (for backward * compatibility). For parameters with multiple values, it's possible * the last "value" may be null. * * @param name the parameter name. * @return the parameter value. */ public String getParameter(String name) { try { Vector values = (Vector)parameters.get(name); if (values == null || values.size() == 0) { return null; } String value = (String)values.elementAt(values.size() - 1); return value; } catch (Exception e) { return null; } } /** * Returns the values of the named parameter as a String array, or null if * the parameter was not sent. The array has one entry for each parameter * field sent. If any field was sent without a value that entry is stored * in the array as a null. The values are guaranteed to be in their * normal, decoded form. A single value is returned as a one-element array. * * @param name the parameter name. * @return the parameter values. */ public String[] getParameterValues(String name) { try { Vector values = (Vector)parameters.get(name); if (values == null || values.size() == 0) { return null; } String[] valuesArray = new String[values.size()]; values.copyInto(valuesArray); return valuesArray; } catch (Exception e) { return null; } } /** * Returns the filesystem name of the specified file, or null if the * file was not included in the upload. A filesystem name is the name * specified by the user. It is also the name under which the file is * actually saved. * * @param name the file name. * @return the filesystem name of the file. */ public String getFilesystemName(String name) { try { UploadedFile file = (UploadedFile)files.get(name); return file.getFilesystemName(); // may be null } catch (Exception e) { return null; } } /** * Returns the content type of the specified file (as supplied by the * client browser), or null if the file was not included in the upload. * * @param name the file name. * @return the content type of the file. */ public String getContentType(String name) { try { UploadedFile file = (UploadedFile)files.get(name); return file.getContentType(); // may be null } catch (Exception e) { return null; } } /** * Returns a File object for the specified file saved on the server's * filesystem, or null if the file was not included in the upload. * * @param name the file name. * @return a File object for the named file. */ public File getFile(String name) { try { UploadedFile file = (UploadedFile)files.get(name); return file.getFile(); // may be null } catch (Exception e) { return null; } }}/********// A class to hold information about an uploaded file.//class UploadedFile { private String dir; private String filename; private String type;private byte[] data; UploadedFile(String dir, String filename, String type, byte[] data) { this.dir = dir; this.filename = filename; this.type = type;this.data=data; } UploadedFile(String dir, String filename, String type) { this.dir = dir; this.filename = filename; this.type = type; }public byte[] getData(){return data;} public String getContentType() { return type; } public String getFilesystemName() { return filename; } public File getFile() { if (dir == null || filename == null) { return null; } else { return new File(dir + File.separator + filename); } }}****/


UploadFile.java
package xxx;import java.io.*;// A class to hold information about an uploaded file.//public class UploadedFile {  private String dir;  private String filename;  private String type;private byte[] data;  UploadedFile(String dir, String filename, String type, byte[] data) {    this.dir = dir;    this.filename = filename;    this.type = type;        this.data=data;  }  UploadedFile(String dir, String filename, String type) {    this.dir = dir;    this.filename = filename;    this.type = type;  }        public byte[] getData()        {                return data;        }  public String getContentType() {    return type;  }  public String getFilesystemName() {    return filename;  }  public File getFile() {    if (dir == null || filename == null) {      return null;    }    else {      return new File(dir + File.separator + filename);    }  }}

热点排行