﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-砖头-文章分类-上传下载</title><link>http://www.blogjava.net/yaozhuan/category/8996.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 07:43:09 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 07:43:09 GMT</pubDate><ttl>60</ttl><item><title>up_down</title><link>http://www.blogjava.net/yaozhuan/articles/101128.html</link><dc:creator>砖头</dc:creator><author>砖头</author><pubDate>Wed, 28 Feb 2007 05:48:00 GMT</pubDate><guid>http://www.blogjava.net/yaozhuan/articles/101128.html</guid><description><![CDATA[
		<a href="http://www.jspsmart.com">www.jspsmart.com</a>
		<br />
		<a href="http://www.servlets.com/cos/index.html">http://www.servlets.com/cos/index.html</a>
		<br />
<img src ="http://www.blogjava.net/yaozhuan/aggbug/101128.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaozhuan/" target="_blank">砖头</a> 2007-02-28 13:48 <a href="http://www.blogjava.net/yaozhuan/articles/101128.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java实现ftp的几种方式（第3方包）</title><link>http://www.blogjava.net/yaozhuan/articles/58909.html</link><dc:creator>砖头</dc:creator><author>砖头</author><pubDate>Wed, 19 Jul 2006 01:34:00 GMT</pubDate><guid>http://www.blogjava.net/yaozhuan/articles/58909.html</guid><wfw:comment>http://www.blogjava.net/yaozhuan/comments/58909.html</wfw:comment><comments>http://www.blogjava.net/yaozhuan/articles/58909.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaozhuan/comments/commentRss/58909.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaozhuan/services/trackbacks/58909.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">最近在做ssh ，sftp。顺便总结一下java实现ftp的几种方式。</font>
		</p>
		<p>
				<font size="2">1、sun.net</font>
		</p>
		<p>
				<font size="2">import sun.net.ftp.*;<br />import sun.net.*;<br />import java.io.FileInputStream;<br />import java.io.FileOutputStream;<br />import java.io.ByteArrayOutputStream;<br />import java.util.ArrayList;<br />import java.util.StringTokenizer;</font>
		</p>
		<p>
				<font size="2">/**<br />    FTP远程命令列表&lt;br&gt;<br />USER    PORT    RETR    ALLO    DELE    SITE    XMKD    CDUP    FEAT&lt;br&gt;<br />PASS    PASV    STOR    REST    CWD     STAT    RMD     XCUP    OPTS&lt;br&gt;<br />ACCT    TYPE    APPE    RNFR    XCWD    HELP    XRMD    STOU    AUTH&lt;br&gt;<br />REIN    STRU    SMNT    RNTO    LIST    NOOP    PWD     SIZE    PBSZ&lt;br&gt;<br />QUIT    MODE    SYST    ABOR    NLST    MKD     XPWD    MDTM    PROT&lt;br&gt;<br />     在服务器上执行命令,如果用sendServer来执行远程命令(不能执行本地FTP命令)的话，所有FTP命令都要加上\r\n&lt;br&gt;<br />          ftpclient.sendServer("XMKD /test/bb\r\n"); //执行服务器上的FTP命令&lt;br&gt;<br />          ftpclient.readServerResponse一定要在sendServer后调用&lt;br&gt;<br />          nameList("/test")获取指目录下的文件列表&lt;br&gt;<br />          XMKD建立目录，当目录存在的情况下再次创建目录时报错&lt;br&gt;<br />          XRMD删除目录&lt;br&gt;<br />          DELE删除文件&lt;br&gt;<br />* &lt;p&gt;Title: 使用JAVA操作FTP服务器(FTP客户端)&lt;/p&gt;<br />* &lt;p&gt;Description: 上传文件的类型及文件大小都放到调用此类的方法中去检测，比如放到前台JAVASCRIPT中去检测等<br />* 针对FTP中的所有调用使用到文件名的地方请使用完整的路径名（绝对路径开始）。<br />* &lt;/p&gt;<br />* &lt;p&gt;Copyright: Copyright (c) 2005&lt;/p&gt;<br />* &lt;p&gt;Company: 静靖工作室&lt;/p&gt;<br />* @author 欧朝敬  13873195792<br />* @version 1.0<br />*/</font>
		</p>
		<p>
				<font size="2">public class FtpUpfile {<br />    private FtpClient ftpclient;<br />    private String ipAddress;<br />    private int ipPort;<br />    private String userName;<br />    private String PassWord;<br />    /**<br />     * 构造函数<br />     * @param ip String 机器IP<br />     * @param port String 机器FTP端口号<br />     * @param username String FTP用户名<br />     * @param password String FTP密码<br />     * @throws Exception<br />     */<br />    public FtpUpfile(String ip, int port, String username, String password) throws<br />            Exception {<br />        ipAddress = new String(ip);<br />        ipPort = port;<br />        ftpclient = new FtpClient(ipAddress, ipPort);<br />        //ftpclient = new FtpClient(ipAddress);<br />        userName = new String(username);<br />        PassWord = new String(password);<br />    }</font>
		</p>
		<p>
				<font size="2">    /**<br />     * 构造函数<br />     * @param ip String 机器IP，默认端口为21<br />     * @param username String FTP用户名<br />     * @param password String FTP密码<br />     * @throws Exception<br />     */<br />    public FtpUpfile(String ip, String username, String password) throws<br />            Exception {<br />        ipAddress = new String(ip);<br />        ipPort = 21;<br />        ftpclient = new FtpClient(ipAddress, ipPort);<br />        //ftpclient = new FtpClient(ipAddress);<br />        userName = new String(username);<br />        PassWord = new String(password);<br />    }</font>
		</p>
		<p>
				<br />
				<font size="2">    /**<br />     * 登录FTP服务器<br />     * @throws Exception<br />     */<br />    public void login() throws Exception {<br />        ftpclient.login(userName, PassWord);<br />    }</font>
		</p>
		<p>
				<font size="2">    /**<br />     * 退出FTP服务器<br />     * @throws Exception<br />     */<br />    public void logout() throws Exception {<br />        //用ftpclient.closeServer()断开FTP出错时用下更语句退出<br />        ftpclient.sendServer("QUIT\r\n");<br />        int reply = ftpclient.readServerResponse(); //取得服务器的返回信息<br />    }</font>
		</p>
		<p>
				<font size="2">    /**<br />     * 在FTP服务器上建立指定的目录,当目录已经存在的情下不会影响目录下的文件,这样用以判断FTP<br />     * 上传文件时保证目录的存在目录格式必须以"/"根目录开头<br />     * @param pathList String<br />     * @throws Exception<br />     */<br />    public void buildList(String pathList) throws Exception {<br />        ftpclient.ascii();<br />        StringTokenizer s = new StringTokenizer(pathList, "/"); //sign<br />        int count = s.countTokens();<br />        String pathName = "";<br />        while (s.hasMoreElements()) {<br />            pathName = pathName + "/" + (String) s.nextElement();<br />            try {<br />                ftpclient.sendServer("XMKD " + pathName + "\r\n");<br />            } catch (Exception e) {<br />                e = null;<br />            }<br />            int reply = ftpclient.readServerResponse();<br />        }<br />        ftpclient.binary();<br />    }</font>
		</p>
		<p>
				<font size="2">    /**<br />     * 取得指定目录下的所有文件名，不包括目录名称<br />     * 分析nameList得到的输入流中的数，得到指定目录下的所有文件名<br />     * @param fullPath String<br />     * @return ArrayList<br />     * @throws Exception<br />     */<br />    public ArrayList fileNames(String fullPath) throws Exception {<br />        ftpclient.ascii(); //注意，使用字符模式<br />        TelnetInputStream list = ftpclient.nameList(fullPath);<br />        byte[] names = new byte[2048];<br />        int bufsize = 0;<br />        bufsize = list.read(names, 0, names.length); //从流中读取<br />        list.close();<br />        ArrayList namesList = new ArrayList();<br />        int i = 0;<br />        int j = 0;<br />        while (i &lt; bufsize /*names.length*/) {<br />            //char bc = (char) names;<br />            //System.out.println(i + "  " + bc + " : " + (int) names);<br />            //i = i + 1;<br />            if (names[i] == 10) { //字符模式为10，二进制模式为13<br />                //文件名在数据中开始下标为j,i-j为文件名的长度,文件名在数据中的结束下标为i-1<br />                //System.out.write(names, j, i - j);<br />                //System.out.println(j + "   " + i + "    " + (i - j));<br />                String tempName = new String(names, j, i - j);<br />                namesList.add(tempName);<br />                //System.out.println(temp);<br />                // 处理代码处<br />                //j = i + 2; //上一次位置二进制模式<br />                j = i + 1; //上一次位置字符模式<br />            }<br />            i = i + 1;<br />        }<br />        return namesList;<br />    }</font>
		</p>
		<p>
				<font size="2">    /**<br />     * 上传文件到FTP服务器,destination路径以FTP服务器的"/"开始，带文件名、<br />     * 上传文件只能使用二进制模式，当文件存在时再次上传则会覆盖<br />     * @param source String<br />     * @param destination String<br />     * @throws Exception<br />     */<br />    public void upFile(String source, String destination) throws Exception {<br />        buildList(destination.substring(0, destination.lastIndexOf("/")));<br />        ftpclient.binary(); //此行代码必须放在buildList之后<br />        TelnetOutputStream ftpOut = ftpclient.put(destination);<br />        TelnetInputStream ftpIn = new TelnetInputStream(new<br />                FileInputStream(source), true);<br />        byte[] buf = new byte[204800];<br />        int bufsize = 0;<br />        while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {<br />            ftpOut.write(buf, 0, bufsize);<br />        }<br />        ftpIn.close();<br />        ftpOut.close();</font>
		</p>
		<p>
				<font size="2">    }</font>
		</p>
		<p>
				<br />
				<font size="2">    /**<br />     * JSP中的流上传到FTP服务器,<br />     * 上传文件只能使用二进制模式，当文件存在时再次上传则会覆盖<br />     * 字节数组做为文件的输入流,此方法适用于JSP中通过<br />     * request输入流来直接上传文件在RequestUpload类中调用了此方法，<br />     * destination路径以FTP服务器的"/"开始，带文件名<br />     * @param sourceData byte[]<br />     * @param destination String<br />     * @throws Exception<br />     */<br />    public void upFile(byte[] sourceData, String destination) throws Exception {<br />        buildList(destination.substring(0, destination.lastIndexOf("/")));<br />        ftpclient.binary(); //此行代码必须放在buildList之后<br />        TelnetOutputStream ftpOut = ftpclient.put(destination);<br />        ftpOut.write(sourceData, 0, sourceData.length);<br />//        ftpOut.flush();<br />        ftpOut.close();<br />    }</font>
		</p>
		<p>
				<font size="2">    /**<br />     * 从FTP文件服务器上下载文件SourceFileName，到本地destinationFileName<br />     * 所有的文件名中都要求包括完整的路径名在内<br />     * @param SourceFileName String<br />     * @param destinationFileName String<br />     * @throws Exception<br />     */<br />    public void downFile(String SourceFileName, String destinationFileName) throws<br />            Exception {<br />        ftpclient.binary(); //一定要使用二进制模式<br />        TelnetInputStream ftpIn = ftpclient.get(SourceFileName);<br />        byte[] buf = new byte[204800];<br />        int bufsize = 0;<br />        FileOutputStream ftpOut = new FileOutputStream(destinationFileName);<br />        while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {<br />            ftpOut.write(buf, 0, bufsize);<br />        }<br />        ftpOut.close();<br />        ftpIn.close();<br />    }</font>
		</p>
		<p>
				<font size="2">    /**<br />     *从FTP文件服务器上下载文件，输出到字节数组中<br />     * @param SourceFileName String<br />     * @return byte[]<br />     * @throws Exception<br />     */<br />    public byte[] downFile(String SourceFileName) throws<br />            Exception {<br />        ftpclient.binary(); //一定要使用二进制模式<br />        TelnetInputStream ftpIn = ftpclient.get(SourceFileName);<br />        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();<br />        byte[] buf = new byte[204800];<br />        int bufsize = 0;</font>
		</p>
		<p>
				<font size="2">        while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {<br />            byteOut.write(buf, 0, bufsize);<br />        }<br />        byte[] return_arraybyte = byteOut.toByteArray();<br />        byteOut.close();<br />        ftpIn.close();<br />        return return_arraybyte;<br />    }</font>
		</p>
		<p>
				<font size="2">    /**调用示例<br />     * FtpUpfile fUp = new FtpUpfile("192.150.189.22", 21, "admin", "admin");<br />     * fUp.login();<br />     * fUp.buildList("/adfadsg/sfsdfd/cc");<br />     * String destination = "/test.zip";<br />     * fUp.upFile("C:\\Documents and Settings\\Administrator\\My Documents\\sample.zip",destination);<br />     * ArrayList filename = fUp.fileNames("/");<br />     * for (int i = 0; i &lt; filename.size(); i++) {<br />     *     System.out.println(filename.get(i).toString());<br />     * }<br />     * fUp.logout();<br />     * @param args String[]<br />     * @throws Exception<br />     */<br />    public static void main(String[] args) throws Exception {<br />        FtpUpfile fUp = new FtpUpfile("172.16.0.142", 22, "ivr", "ivr");<br />        fUp.login();<br />        /*        fUp.buildList("/adfadsg/sfsdfd/cc");<br />                String destination = "/test/SetupDJ.rar";<br />                fUp.upFile(<br />         "C:\\Documents and Settings\\Administrator\\My Documents\\SetupDJ.rar",<br />                        destination);<br />                ArrayList filename = fUp.fileNames("/");<br />                for (int i = 0; i &lt; filename.size(); i++) {<br />                    System.out.println(filename.get(i).toString());<br />                }</font>
		</p>
		<p>
				<font size="2">                fUp.downFile("/sample.zip", "d:\\sample.zip");<br />         */<br />        FileInputStream fin = new FileInputStream(<br />                "d:\\wapPush.txt");<br />        byte[] data = new byte[20480000];<br />        fin.read(data, 0, data.length);<br />        fUp.upFile(data, "/home/cdr/wapPush.txt");<br />        fUp.logout();<br />        System.out.println("程序运行完成！");<br />        /*FTP远程命令列表<br />         USER    PORT    RETR    ALLO    DELE    SITE    XMKD    CDUP    FEAT<br />         PASS    PASV    STOR    REST    CWD     STAT    RMD     XCUP    OPTS<br />         ACCT    TYPE    APPE    RNFR    XCWD    HELP    XRMD    STOU    AUTH<br />         REIN    STRU    SMNT    RNTO    LIST    NOOP    PWD     SIZE    PBSZ<br />         QUIT    MODE    SYST    ABOR    NLST    MKD     XPWD    MDTM    PROT<br />         */<br />        /*在服务器上执行命令,如果用sendServer来执行远程命令(不能执行本地FTP命令)的话，所有FTP命令都要加上\r\n<br />         ftpclient.sendServer("XMKD /test/bb\r\n"); //执行服务器上的FTP命令<br />         ftpclient.readServerResponse一定要在sendServer后调用<br />         nameList("/test")获取指目录下的文件列表<br />         XMKD建立目录，当目录存在的情况下再次创建目录时报错<br />         XRMD删除目录<br />         DELE删除文件<br />         */<br />    }<br />}</font>
		</p>
		<p>
				<font size="2">
				</font>
		</p>
		<p>
				<font size="2">2、apache的common.net</font>
		</p>
		<p>
				<font size="2">package com.ftp;</font>
		</p>
		<p>
				<font size="2">import java.io.*;<br />import java.net.InetAddress;<br />import org.apache.commons.net.ftp.*;<br />import org.apache.commons.net.ftp.parser.*;<br />import org.apache.commons.net.ftp.FTPFile;<br />import org.apache.commons.net.ftp.FTPFileEntryParser;</font>
		</p>
		<p>
				<font size="2">import sun.net.TelnetInputStream;</font>
		</p>
		<p>
				<font size="2">public class FtpAppache {<br />    public FtpAppache() throws Exception{<br />       // sun.net.ftp.FtpClient ft = null;<br />      //  TelnetInputStream t = ft.list();<br />       // t.setStickyCRLF(true);<br />    }</font>
		</p>
		<p>
				<font size="2">    public void test1() throws Exception {<br />        //<br />        String strTemp = "";</font>
		</p>
		<p>
				<font size="2">        //InetAddress ia = InetAddress.getByName("192.168.0.193");<br />        FTPClient ftp = new FTPClient();<br />        </font>
				<a href="ftp://ftp.connect(/" 172.16.0.142?,22?="">
						<font size="2">ftp.connect("172.16.0.142",22</font>
				</a>
				<font size="2">);</font>
		</p>
		<p>
				<font size="2">        boolean blogin = </font>
				<a href="ftp://ftp.login(/" ivr?="">
						<font size="2">ftp.login("ivr</font>
				</a>
				<font size="2">", "ivr");<br />        if (!blogin) {<br />            System.out.println("连接失败");<br />            </font>
				<a href="ftp://ftp.disconnect/">
						<font size="2">ftp.disconnect</font>
				</a>
				<font size="2">();<br />            ftp = null;<br />            return;<br />        }</font>
		</p>
		<p>
				<font size="2">        /*//如果是中文名必需进行字符集转换<br />        boolean bMakeFlag = </font>
				<a href="ftp://ftp.makedirectory(new/">
						<font size="2">ftp.makeDirectory(new</font>
				</a>
				<font size="2"> String("测试目录".getBytes(<br />            "gb2312"), "iso-8859-1")); //在服务器创建目录<br />        //上传文件到服务器，目录自由创建<br />        File file = new File("c:\\test.properties");<br />        </font>
				<a href="ftp://ftp.storefile(/" test.properties?,new?="">
						<font size="2">ftp.storeFile("test.properties",new</font>
				</a>
				<font size="2"> FileInputStream(file));*/</font>
		</p>
		<p>
				<font size="2">        System.out.println(</font>
				<a href="ftp://ftp.getsystemname/">
						<font size="2">ftp.getSystemName</font>
				</a>
				<font size="2">());</font>
		</p>
		<p>
				<font size="2">        FTPFile[] ftpFiles = </font>
				<a href="ftp://ftp.listfiles/">
						<font size="2">ftp.listFiles</font>
				</a>
				<font size="2">();<br />        if (ftpFiles != null) {<br />            for (int i = 0; i &lt; ftpFiles.length; i++) {<br />                System.out.println(ftpFiles[i].getName());<br />                //System.out.println(ftpFiles[i].isFile());<br />                if (ftpFiles[i].isFile()) {<br />                    FTPFile ftpf = new FTPFile();<br />                    /*System.err.println(ftpf.hasPermission(FTPFile.GROUP_ACCESS,<br />                                  FTPFile.EXECUTE_PERMISSION));<br />                    System.err.println("READ_PERMISSION="+ftpf.hasPermission(FTPFile.USER_ACCESS,<br />                                      FTPFile.READ_PERMISSION));<br />                    System.err.println("EXECUTE_PERMISSION="+ftpf.hasPermission(FTPFile.USER_ACCESS,<br />                                  FTPFile.EXECUTE_PERMISSION));<br />                    System.err.println("WRITE_PERMISSION="+ftpf.hasPermission(FTPFile.USER_ACCESS,<br />                                  FTPFile.WRITE_PERMISSION));<br />                    System.err.println(ftpf.hasPermission(FTPFile.WORLD_ACCESS,<br />                                      FTPFile.READ_PERMISSION));*/</font>
		</p>
		<p>
				<font size="2">                }<br />                //System.out.println(ftpFiles[i].getUser());<br />            }<br />        }</font>
		</p>
		<p>
				<font size="2">        //下载服务器文件<br />        FileOutputStream fos = new FileOutputStream("e:/proftpd-1.2.10.tar.gz");<br />        </font>
				<a href="ftp://ftp.retrievefile(/" proftpd-1.2.10.tar.gz?,fos?="">
						<font size="2">ftp.retrieveFile("proftpd-1.2.10.tar.gz",fos</font>
				</a>
				<font size="2">);<br />        fos.close();</font>
		</p>
		<p>
				<font size="2">        //改变ftp目录<br />        //ftp.changeToParentDirectory();//回到父目录<br />        //ftp.changeWorkingDirectory("");//转移工作目录<br />        //ftp.completePendingCommand();//</font>
		</p>
		<p>
				<font size="2">        //删除ftp服务器文件<br />        //ftp.deleteFile("");</font>
		</p>
		<p>
				<font size="2">        //注销当前用户，<br />        //ftp.logout();<br />        //ftp.structureMount("");<br />        </font>
				<a href="ftp://ftp.disconnect/">
						<font size="2">ftp.disconnect</font>
				</a>
				<font size="2">();<br />        ftp = null;<br />    }</font>
		</p>
		<p>
				<font size="2">    /**<br />     * 封装好的东西是好用，碰到这种问题，我们就。。。up<br />     * @param args String[]<br />     */<br />    public static void main(String[] args) {<br />        try {<br />            FtpAppache ftpAppache1 = new FtpAppache();<br />            ftpAppache1.test1();<br />        }<br />        catch (Exception e) {<br />            e.printStackTrace();<br />        }<br />    }</font>
		</p>
		<p>
				<font size="2">}<br /></font>
		</p>
		<p>
				<font size="2">3、edtftpj</font>
		</p>
		<p>
				<font size="2">package com.boss;</font>
		</p>
		<p>
				<font size="2">
				</font>
		</p>
		<p>
				<font size="2">import com.enterprisedt.net.ftp.FTPClient;<br />import com.enterprisedt.net.ftp.FTPMessageCollector;<br />import com.enterprisedt.net.ftp.FTPTransferType;<br />import com.enterprisedt.net.ftp.FTPConnectMode;<br />import com.enterprisedt.util.debug.Level;<br />import com.enterprisedt.util.debug.Logger;</font>
		</p>
		<p>
				<font size="2">/**<br /> *  Simple test class for FTPClient<br /> *<br /> *  @author      Hans Andersen<br /> *  @author      Bruce Blackshaw<br /> */<br />public class Demo {</font>
		</p>
		<p>
				<font size="2">    /**<br />     *  Revision control id<br />     */<br />    private static String cvsId = "@(#)$Id: Demo.java,v 1.6 2005/03/18 11:12:56 bruceb Exp $";</font>
		</p>
		<p>
				<font size="2">    /**<br />     *  Log stream<br />     */<br />    private static Logger log = Logger.getLogger(Demo.class);</font>
		</p>
		<p>
				<font size="2">    /**<br />     * Standard main()<br />     * <br />     * @param args  standard args<br />     */<br />    public static void main(String[] args) {</font>
		</p>
		<p>
				<font size="2">        </font>
		</p>
		<p>
				<font size="2">        // assign args to make it clear<br />        String host = "172.16.0.142";<br />        String user = "ivr";<br />        String password = "ivr";</font>
		</p>
		<p>
				<font size="2">        Logger.setLevel(Level.ALL);</font>
		</p>
		<p>
				<font size="2">        FTPClient ftp = null;</font>
		</p>
		<p>
				<font size="2">        try {<br />            // set up client    <br />            ftp = new FTPClient();<br />            </font>
				<a href="ftp://ftp.setremotehost(host/">
						<font size="2">ftp.setRemoteHost(host</font>
				</a>
				<font size="2">);<br />            </font>
				<a href="ftp://ftp.setremoteport(22/">
						<font size="2">ftp.setRemotePort(22</font>
				</a>
				<font size="2">);<br />            </font>
				<a href="ftp://ftp.setconnectmode(ftpconnectmode.active/">
						<font size="2">ftp.setConnectMode(FTPConnectMode.ACTIVE</font>
				</a>
				<font size="2">);<br />            FTPMessageCollector listener = new FTPMessageCollector();<br />            </font>
				<a href="ftp://ftp.setmessagelistener(listener/">
						<font size="2">ftp.setMessageListener(listener</font>
				</a>
				<font size="2">);<br />            //ftp.setAutoPassiveIPSubstitution(true);</font>
		</p>
		<p>
				<font size="2">            // connect<br />            log.info("Connecting");<br />            </font>
				<a href="ftp://ftp.connect/">
						<font size="2">ftp.connect</font>
				</a>
				<font size="2">();</font>
		</p>
		<p>
				<font size="2">             // login<br />            log.info("Logging in");<br />            </font>
				<a href="ftp://ftp.login(user/">
						<font size="2">ftp.login(user</font>
				</a>
				<font size="2">, password);</font>
		</p>
		<p>
				<font size="2">            // set up passive ASCII transfers<br />            log.debug("Setting up passive, ASCII transfers");<br />            </font>
				<a href="ftp://ftp.setconnectmode(ftpconnectmode.pasv/">
						<font size="2">ftp.setConnectMode(FTPConnectMode.PASV</font>
				</a>
				<font size="2">);<br />            </font>
				<a href="ftp://ftp.settype(ftptransfertype.ascii/">
						<font size="2">ftp.setType(FTPTransferType.ASCII</font>
				</a>
				<font size="2">);</font>
		</p>
		<p>
				<font size="2">            // get directory and print it to console            <br />            log.debug("Directory before put:");<br />            String[] files = </font>
				<a href="ftp://ftp.dir/">
						<font size="2">ftp.dir</font>
				</a>
				<font size="2">(".", true);<br />            for (int i = 0; i &lt; files.length; i++)<br />                log.debug(files[i]);</font>
		</p>
		<p>
				<font size="2">            // copy file to server <br />            log.info("Putting file");<br />            </font>
				<a href="ftp://ftp.put(/" test.txt?="">
						<font size="2">ftp.put("test.txt</font>
				</a>
				<font size="2">", "test.txt");</font>
		</p>
		<p>
				<font size="2">            // get directory and print it to console            <br />            log.debug("Directory after put");<br />            files = </font>
				<a href="ftp://ftp.dir/">
						<font size="2">ftp.dir</font>
				</a>
				<font size="2">(".", true);<br />            for (int i = 0; i &lt; files.length; i++)<br />                log.debug(files[i]);</font>
		</p>
		<p>
				<font size="2">            // copy file from server<br />            log.info("Getting file");<br />            </font>
				<a href="ftp://ftp.get(/" test.txt?="">
						<font size="2">ftp.get("test.txt</font>
				</a>
				<font size="2">" + ".copy", "test.txt");</font>
		</p>
		<p>
				<font size="2">            // delete file from server<br />            log.info("Deleting file");<br />            </font>
				<a href="ftp://ftp.delete(/" test.txt?="">
						<font size="2">ftp.delete("test.txt</font>
				</a>
				<font size="2">");</font>
		</p>
		<p>
				<font size="2">            // get directory and print it to console            <br />            log.debug("Directory after delete");<br />            files = </font>
				<a href="ftp://ftp.dir/">
						<font size="2">ftp.dir</font>
				</a>
				<font size="2">("", true);<br />            for (int i = 0; i &lt; files.length; i++)<br />                log.debug(files[i]);</font>
		</p>
		<p>
				<font size="2">            // Shut down client                <br />            log.info("Quitting client");<br />            </font>
				<a href="ftp://ftp.quit/">
						<font size="2">ftp.quit</font>
				</a>
				<font size="2">();</font>
		</p>
		<p>
				<font size="2">            String messages = listener.getLog();<br />            log.debug("Listener log:");<br />            log.debug(messages);</font>
		</p>
		<p>
				<font size="2">            log.info("Test complete");<br />        } catch (Exception e) {<br />            log.error("Demo failed", e);<br />        }<br />    }   </font>
		</p>
		<p>
				<font size="2">    /**<br />     *  Basic usage statement<br />     */<br />    public static void usage() {</font>
		</p>
		<p>
				<font size="2">        System.out.println("Usage: Demo remotehost user password");<br />    }</font>
		</p>
		<p>
				<font size="2">}<br /></font>
		</p>
		<p>
				<font size="2">4、sshtools，maverick-ssh.jar</font>
		</p>
		<p>
				<font size="2">package com.sshtools.examples.echo;</font>
		</p>
		<p>
				<font size="2">import com.sshtools.j2ssh.configuration.SshConnectionProperties;<br />import com.sshtools.j2ssh.authentication.*;<br />import com.sshtools.j2ssh.transport.*;<br />import com.sshtools.j2ssh.SshException;<br />import org.apache.log4j.Logger;<br />import java.io.*;<br />import com.sshtools.j2ssh.subsystem.*;</font>
		</p>
		<p>
				<font size="2">/**<br /> *<br /> * &lt;p&gt;Echo Client&lt;/p&gt;<br /> * &lt;p&gt;Provides a simple example of using the sshtools subsystem framework&lt;/p&gt;<br /> * &lt;p&gt;Copyright: Copyright (c) 2002 Lee David Painter&lt;/p&gt;<br /> * &lt;p&gt;Company: Sshtools.com&lt;/p&gt;<br /> * @author Lee David Painter<br /> * @version 1.0<br /> */<br />public class EchoClient extends SubsystemClient {</font>
		</p>
		<p>
				<font size="2">  private static Logger log = Logger.getLogger(EchoClient.class);</font>
		</p>
		<p>
				<font size="2">  /**<br />   * Contructor for the echo client object<br />   */<br />  public EchoClient() {<br />    super("echo", true);</font>
		</p>
		<p>
				<font size="2">    registerSubsystemMessage(EchoMessage.SSH_ECHO_MESSAGE, EchoMessage.class);</font>
		</p>
		<p>
				<font size="2">  }</font>
		</p>
		<p>
				<font size="2">  /**<br />   * Sends a string to the remote ssh server and waits for the same string<br />   * to be echoed back<br />   * @param msg<br />   */<br />  public void sendEcho(String msg) {</font>
		</p>
		<p>
				<font size="2">    try {</font>
		</p>
		<p>
				<font size="2">      EchoMessage echo = new EchoMessage(msg);</font>
		</p>
		<p>
				<font size="2">      this.sendMessage(echo);</font>
		</p>
		<p>
				<font size="2">      SubsystemMessage reply = nextMessage();</font>
		</p>
		<p>
				<font size="2">      if(reply.getMessageType()== EchoMessage.SSH_ECHO_MESSAGE) {<br />          System.out.println("Server echo&gt; " + ((EchoMessage)reply).getMessage());<br />      }</font>
		</p>
		<p>
				<font size="2">    }<br />    catch(SshException e) {<br />      e.printStackTrace();<br />    }</font>
		</p>
		<p>
				<font size="2">  }</font>
		</p>
		<p>
				<font size="2">
				</font>
		</p>
		<p>
				<font size="2">  /**<br />   * Entry point for the EchoClient sample application<br />   * @param args<br />   */<br />  public static void main(String args[]) {</font>
		</p>
		<p>
				<font size="2">    try {<br />        org.apache.log4j.BasicConfigurator.configure();</font>
		</p>
		<p>
				<font size="2">        EchoClient client = new EchoClient();</font>
		</p>
		<p>
				<font size="2">        SshConnectionProperties properties = new SshConnectionProperties();<br />        properties.setHost("172.106.0.142");<br />        properties.setUsername("ivr");<br />        final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));<br />        client.connect(properties, new HostKeyVerification() {</font>
		</p>
		<p>
				<font size="2">                    public void onDeniedHost(String host) {<br />                      System.out.println("Access to the host " + host + " is denied from this system");<br />                    }</font>
		</p>
		<p>
				<font size="2">                    public void onHostKeyMismatch(String host, String fingerprint, String actual) {</font>
		</p>
		<p>
				<font size="2">                      try {<br />                        System.out.println("The host key supplied by " + host + " is: " + actual);<br />                        System.out.println("The current allowed key for " + host + " is: " + fingerprint);<br />                        getResponse(host, actual);<br />                      }<br />                      catch(Exception e) {<br />                        e.printStackTrace();<br />                      }<br />                    }</font>
		</p>
		<p>
				<font size="2">                    private void getResponse(String host, String fingerprint)<br />                                                    throws InvalidHostFileException,<br />                                                                IOException {<br />                         String response = "";<br />                         while(!(response.equalsIgnoreCase("YES") || response.equalsIgnoreCase("NO")<br />                                    || response.equalsIgnoreCase("ALWAYS"))) {<br />                              System.out.print("Do you want to allow this host key? [Yes|No|Always]: ");<br />                              response = reader.readLine();<br />                        }</font>
		</p>
		<p>
				<font size="2">                        if(response.equalsIgnoreCase("YES"))<br />                          allowHost(host, fingerprint, false);</font>
		</p>
		<p>
				<font size="2">                        if(response.equalsIgnoreCase("NO")) {<br />                          System.out.println("Cannot continue without a valid host key");<br />                          System.exit(1);<br />                        }</font>
		</p>
		<p>
				<font size="2">                        if(response.equalsIgnoreCase("ALWAYS"))<br />                          allowHost(host, fingerprint, true);</font>
		</p>
		<p>
				<font size="2">                    }</font>
		</p>
		<p>
				<font size="2">                    public void onUnknownHost(String host, String fingerprint) {</font>
		</p>
		<p>
				<font size="2">                      try {<br />                      System.out.println("The host " +  host + " is currently unknown to the system");<br />                      System.out.println("The host key fingerprint is: " + fingerprint);<br />                      getResponse(host, fingerprint);<br />                      }<br />                      catch(Exception e) {<br />                        e.printStackTrace();<br />                      }<br />                    }<br />                });</font>
		</p>
		<p>
				<font size="2">              PasswordAuthentication password = new PasswordAuthentication();<br />              password.setPassword("ivr");<br />              password.setUsername("ivr");<br />              client.authenticate(password);</font>
		</p>
		<p>
				<font size="2">              String message;</font>
		</p>
		<p>
				<font size="2">              do {</font>
		</p>
		<p>
				<font size="2">              System.out.print("Message&gt; ");<br />              message = reader.readLine();<br />              client.sendEcho(message);<br />              } while(!message.equalsIgnoreCase("EXIT"));</font>
		</p>
		<p>
				<br />
				<font size="2">            client.close();<br />        }<br />        catch(SshException e) {<br />          e.printStackTrace();<br />        }<br />        catch(IOException ioe) {<br />          ioe.printStackTrace();<br />        }</font>
		</p>
		<p>
				<br />
				<font size="2">  }<br />}</font>
		</p>
<img src ="http://www.blogjava.net/yaozhuan/aggbug/58909.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaozhuan/" target="_blank">砖头</a> 2006-07-19 09:34 <a href="http://www.blogjava.net/yaozhuan/articles/58909.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jspsmart</title><link>http://www.blogjava.net/yaozhuan/articles/37496.html</link><dc:creator>砖头</dc:creator><author>砖头</author><pubDate>Sun, 26 Mar 2006 12:22:00 GMT</pubDate><guid>http://www.blogjava.net/yaozhuan/articles/37496.html</guid><wfw:comment>http://www.blogjava.net/yaozhuan/comments/37496.html</wfw:comment><comments>http://www.blogjava.net/yaozhuan/articles/37496.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaozhuan/comments/commentRss/37496.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaozhuan/services/trackbacks/37496.html</trackback:ping><description><![CDATA[
		<span class="t18">
				<span class="myp11">
						<font id="zoom">
								<font size="2">
										<b>㈠ File类</b>
										<br />
										<br />　　这个类包装了一个上传文件的所有信息。通过它，可以得到上传文件的文件名、文件大小、扩展名、文件数据等信息。 <br /><br />　　File类主要提供以下方法： <br /><br />1、saveAs作用：将文件换名另存。 <br /><br />原型： <br />public void saveAs(java.lang.String destFilePathName) <br />或 <br />public void saveAs(java.lang.String destFilePathName, int optionSaveAs) <br /><br />其中，destFilePathName是另存的文件名，optionSaveAs是另存的选项，该选项有三个值，分别是SAVEAS_PHYSICAL, SAVEAS_VIRTUAL，SAVEAS_AUTO。SAVEAS_PHYSICAL表明以操作系统的根目录为文件根目录另存文件， SAVEAS_VIRTUAL表明以Web应用程序的根目录为文件根目录另存文件，SAVEAS_AUTO则表示让组件决定，当Web应用程序的根目录存在另存文件的目录时，它会选择SAVEAS_VIRTUAL，否则会选择SAVEAS_PHYSICAL。 <br /><br />例如，saveAs ("/upload/sample.zip",SAVEAS_PHYSICAL)执行后若Web服务器安装在C盘，则另存的文件名实际是c:\ upload\sample.zip。而saveAs("/upload/sample.zip",SAVEAS_VIRTUAL)执行后若Web应用程序的根目录是webapps/jspsmartupload，则另存的文件名实际是 webapps/jspsmartupload/upload/sample.zip。saveAs("/upload/sample.zip", SAVEAS_AUTO)执行时若Web应用程序根目录下存在upload目录，则其效果同saveAs("/upload/sample.zip", SAVEAS_VIRTUAL)，否则同saveAs("/upload/sample.zip",SAVEAS_PHYSICAL)。 <br /><br />建议：对于Web程序的开发来说，最好使用SAVEAS_VIRTUAL，以便移植。 <br /><br />2、isMissing <br /><br />作用：这个方法用于判断用户是否选择了文件，也即对应的表单项是否有值。选择了文件时，它返回false。未选文件时，它返回true。 <br /><br />原型：public boolean isMissing() <br /><br />3、getFieldName <br /><br />作用：取HTML表单中对应于此上传文件的表单项的名字。 <br /><br />原型：public String getFieldName() <br /><br />4、getFileName <br /><br />作用：取文件名（不含目录信息） <br /><br />原型：public String getFileName() <br /><br />5、getFilePathName <br /><br />作用：取文件全名（带目录） <br /><br />原型：public String getFilePathName <br /><br />6、getFileExt <br /><br />作用：取文件扩展名（后缀） <br /><br />原型：public String getFileExt() <br /><br />7、getSize <br /><br />作用：取文件长度（以字节计） <br /><br />原型：public int getSize() <br /><br />8、getBinaryData <br /><br />作用：取文件数据中指定位移处的一个字节，用于检测文件等处理。 <br /><br />原型：public byte getBinaryData(int index)。其中，index表示位移，其值在0到getSize()-1之间。 <br /><br /><b>㈡ Files类</b><br /><br />　　这个类表示所有上传文件的集合，通过它可以得到上传文件的数目、大小等信息。有以下方法： <br /><br />1、getCount <br /><br />作用：取得上传文件的数目。 <br /><br />原型：public int getCount() <br /><br />2、getFile <br /><br />作用：取得指定位移处的文件对象File（这是com.jspsmart.upload.File，不是java.io.File，注意区分）。 <br /><br />原型：public File getFile(int index)。其中，index为指定位移，其值在0到getCount()-1之间。 <br /><br />3、getSize <br /><br />作用：取得上传文件的总长度，可用于限制一次性上传的数据量大小。 <br /><br />原型：public long getSize() <br /><br />4、getCollection <br /><br />作用：将所有上传文件对象以Collection的形式返回，以便其它应用程序引用，浏览上传文件信息。 <br /><br />原型：public Collection getCollection() <br /><br />5、getEnumeration <br /><br />作用：将所有上传文件对象以Enumeration（枚举）的形式返回，以便其它应用程序浏览上传文件信息。 <br /><br />原型：public Enumeration getEnumeration() <br /><br /><b>㈢ Request类</b><br /><br />　　这个类的功能等同于JSP内置的对象request。只所以提供这个类，是因为对于文件上传表单，通过request对象无法获得表单项的值，必须通过jspSmartUpload组件提供的Request对象来获取。该类提供如下方法： <br /><br />1、getParameter <br /><br />作用：获取指定参数之值。当参数不存在时，返回值为null。 <br /><br />原型：public String getParameter(String name)。其中，name为参数的名字。 <br /><br />2、getParameterValues <br /><br />作用：当一个参数可以有多个值时，用此方法来取其值。它返回的是一个字符串数组。当参数不存在时，返回值为null。 <br /><br />原型：public String[] getParameterValues(String name)。其中，name为参数的名字。 <br /><br />3、getParameterNames <br /><br />作用：取得Request对象中所有参数的名字，用于遍历所有参数。它返回的是一个枚举型的对象。 <br /><br />原型：public Enumeration getParameterNames() <br /><br /><b>㈣ SmartUpload类</b>这个类完成上传下载工作。 <br /><br /><b>A．上传与下载共用的方法：</b><br /><br />只有一个：initialize。 <br /><br />作用：执行上传下载的初始化工作，必须第一个执行。 <br /><br />原型：有多个，主要使用下面这个： <br /><br />public final void initialize(javax.servlet.jsp.PageContext pageContext) <br /><br />其中，pageContext为JSP页面内置对象（页面上下文）。 <br /><br /><b>B．上传文件使用的方法：</b><br /><br />1、upload <br /><br />作用：上传文件数据。对于上传操作，第一步执行initialize方法，第二步就要执行这个方法。 <br /><br />原型：public void upload() <br /><br />2、save <br /><br />作用：将全部上传文件保存到指定目录下，并返回保存的文件个数。 <br /><br />原型：public int save(String destPathName) <br /><br />和public int save(String destPathName,int option) <br /><br />其中，destPathName为文件保存目录，option为保存选项，它有三个值，分别是SAVE_PHYSICAL,SAVE_VIRTUAL和 SAVE_AUTO。（同File类的saveAs方法的选项之值类似）SAVE_PHYSICAL指示组件将文件保存到以操作系统根目录为文件根目录的目录下，SAVE_VIRTUAL指示组件将文件保存到以Web应用程序根目录为文件根目录的目录下，而SAVE_AUTO则表示由组件自动选择。 <br /><br />注：save(destPathName)作用等同于save(destPathName,SAVE_AUTO)。 <br /><br />3、getSize <br /><br />作用：取上传文件数据的总长度 <br /><br />原型：public int getSize() <br /><br />4、getFiles <br /><br />作用：取全部上传文件，以Files对象形式返回，可以利用Files类的操作方法来获得上传文件的数目等信息。 <br /><br />原型：public Files getFiles() <br /><br />5、getRequest <br /><br />作用：取得Request对象，以便由此对象获得上传表单参数之值。 <br /><br />原型：public Request getRequest() <br /><br />6、setAllowedFilesList <br /><br />作用：设定允许上传带有指定扩展名的文件，当上传过程中有文件名不允许时，组件将抛出异常。 <br /><br />原型：public void setAllowedFilesList(String allowedFilesList) <br /><br />其中，allowedFilesList为允许上传的文件扩展名列表，各个扩展名之间以逗号分隔。如果想允许上传那些没有扩展名的文件，可以用两个逗号表示。例如：setAllowedFilesList("doc,txt,,")将允许上传带doc和txt扩展名的文件以及没有扩展名的文件。 <br /><br />7、setDeniedFilesList <br /><br />作用：用于限制上传那些带有指定扩展名的文件。若有文件扩展名被限制，则上传时组件将抛出异常。 <br /><br />原型：public void setDeniedFilesList(String deniedFilesList) <br /><br />其中，deniedFilesList为禁止上传的文件扩展名列表，各个扩展名之间以逗号分隔。如果想禁止上传那些没有扩展名的文件，可以用两个逗号来表示。例如：setDeniedFilesList("exe,bat,,")将禁止上传带exe和bat扩展名的文件以及没有扩展名的文件。 <br /><br />8、setMaxFileSize <br /><br />作用：设定每个文件允许上传的最大长度。 <br /><br />原型：public void setMaxFileSize(long maxFileSize) <br /><br />其中，maxFileSize为为每个文件允许上传的最大长度，当文件超出此长度时，将不被上传。 <br /><br />9、setTotalMaxFileSize <br /><br />作用：设定允许上传的文件的总长度，用于限制一次性上传的数据量大小。 <br /><br />原型：public void setTotalMaxFileSize(long totalMaxFileSize) <br /><br />其中，totalMaxFileSize为允许上传的文件的总长度。 <br /><br /><b>C．下载文件常用的方法</b><br /><br />1、setContentDisposition <br /><br />作用：将数据追加到MIME文件头的CONTENT-DISPOSITION域。jspSmartUpload组件会在返回下载的信息时自动填写MIME文件头的CONTENT-DISPOSITION域，如果用户需要添加额外信息，请用此方法。 <br /><br />原型：public void setContentDisposition(String contentDisposition) <br /><br />其中，contentDisposition为要添加的数据。如果contentDisposition为null，则组件将自动添加 "attachment;"，以表明将下载的文件作为附件，结果是IE浏览器将会提示另存文件，而不是自动打开这个文件（IE浏览器一般根据下载的文件扩展名决定执行什么操作，扩展名为doc的将用word程序打开，扩展名为pdf的将用acrobat程序打开，等等）。 <br /><br />2、downloadFile <br /><br />作用：下载文件。 <br /><br />原型：共有以下三个原型可用，第一个最常用，后两个用于特殊情况下的文件下载（如更改内容类型，更改另存的文件名）。 <br /><br />① public void downloadFile(String sourceFilePathName) <br /><br />其中，sourceFilePathName为要下载的文件名（带目录的文件全名） <br /><br />② public void downloadFile(String sourceFilePathName,String contentType) <br /><br />其中，sourceFilePathName为要下载的文件名（带目录的文件全名）,contentType为内容类型（MIME格式的文件类型信息，可被浏览器识别）。 <br /><br />③ public void downloadFile(String sourceFilePathName,String contentType,String destFileName) <br /><br />其中，sourceFilePathName为要下载的文件名（带目录的文件全名）,contentType为内容类型（MIME格式的文件类型信息，可被浏览器识别）,destFileName为下载后默认的另存文件名。 <br /><br /><b>三、文件上传篇</b><br /><br /><b>㈠ 表单要求</b><br /><br />对于上传文件的FORM表单，有两个要求： <br /><br />1、METHOD应用POST，即METHOD="POST"。 <br /><br />2、增加属性：ENCTYPE="multipart/form-data" <br /><br />下面是一个用于上传文件的FORM表单的例子： <br /><br /><ccid_nobr></ccid_nobr></font>
								<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1">
										<tbody>
												<tr>
														<td class="code" bgcolor="#e6e6e6">
																<pre>
																		<font size="2">
																				<ccid_code>
																				&lt;FORM METHOD="POST" ENCTYPE="multipart/form-data" <br />ACTION="/jspSmartUpload/upload.jsp"&gt;<br />&lt;INPUT TYPE="FILE" NAME="MYFILE"&gt;<br />&lt;INPUT TYPE="SUBMIT"&gt;<br />&lt;/FORM&gt;
																		</ccid_code>
																		</font>
																</pre>
														</td>
												</tr>
										</tbody>
								</table>
						</font>
						<br />
						<br />
						<font size="2">
								<b>㈡ 上传的例子</b>
								<br />
								<br />
								<b>1、上传页面upload.html</b>
								<br />
								<br />本页面提供表单，让用户选择要上传的文件，点击"上传"按钮执行上传操作。 <br /><br />页面源码如下： <br /><br /><ccid_nobr></ccid_nobr></font>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" bgcolor="#e6e6e6">
														<pre>
																<font size="2">
																		<ccid_code>
																		&lt;!--<br />    文件名：upload.html<br />	作  者：纵横软件制作中心雨亦奇(zhsoft88@sohu.com)<br />--&gt;<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;文件上传&lt;/title&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br />&lt;/head&gt;<br /><br />&lt;body&gt;<br />&lt;p&gt;&amp;nbsp;&lt;/p&gt;<br />&lt;p align="center"&gt;上传文件选择&lt;/p&gt;<br />&lt;FORM METHOD="POST" ACTION="jsp/do_upload.jsp"<br />ENCTYPE="multipart/form-data"&gt;<br />&lt;input type="hidden" name="TEST" value="good"&gt;<br />  &lt;table width="75%" border="1" align="center"&gt;<br />    &lt;tr&gt; <br />      &lt;td&gt;&lt;div align="center"&gt;1、 <br />          &lt;input type="FILE" name="FILE1" size="30"&gt;<br />        &lt;/div&gt;&lt;/td&gt;<br />    &lt;/tr&gt;<br />    &lt;tr&gt; <br />      &lt;td&gt;&lt;div align="center"&gt;2、 <br />          &lt;input type="FILE" name="FILE2" size="30"&gt;<br />        &lt;/div&gt;&lt;/td&gt;<br />    &lt;/tr&gt;<br />    &lt;tr&gt; <br />      &lt;td&gt;&lt;div align="center"&gt;3、 <br />          &lt;input type="FILE" name="FILE3" size="30"&gt;<br />        &lt;/div&gt;&lt;/td&gt;<br />    &lt;/tr&gt;<br />    &lt;tr&gt; <br />      &lt;td&gt;&lt;div align="center"&gt;4、 <br />          &lt;input type="FILE" name="FILE4" size="30"&gt;<br />        &lt;/div&gt;&lt;/td&gt;<br />    &lt;/tr&gt;<br />    &lt;tr&gt; <br />      &lt;td&gt;&lt;div align="center"&gt;<br />          &lt;input type="submit" name="Submit" value="上传它！"&gt;<br />        &lt;/div&gt;&lt;/td&gt;<br />    &lt;/tr&gt;<br />  &lt;/table&gt;<br />&lt;/FORM&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;
																</ccid_code>
																</font>
														</pre>
												</td>
										</tr>
								</tbody>
						</table>
						<br />
						<br />
						<font size="2">
								<b>2、上传处理页面do_upload.jsp</b>
								<br />
								<br />本页面执行文件上传操作。页面源码中详细介绍了上传方法的用法，在此不赘述了。 <br /><br />页面源码如下： <br /><br /><ccid_nobr></ccid_nobr></font>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" bgcolor="#e6e6e6">
														<pre>
																<font size="2">
																		<ccid_code>
																		&lt;%--<br />	文件名：do_upload.jsp<br />	作  者：纵横软件制作中心雨亦奇(zhsoft88@sohu.com)<br />--%&gt;<br />&lt;%@ page contentType="text/html; charset=gb2312" language="java" <br />import="java.util.*,com.jspsmart.upload.*" errorPage="" %&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;文件上传处理页面&lt;/title&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br />&lt;/head&gt;<br /><br />&lt;body&gt;<br />&lt;%<br />	// 新建一个SmartUpload对象<br />	SmartUpload su = new SmartUpload();<br />	// 上传初始化<br />	su.initialize(pageContext);<br />	// 设定上传限制<br />	// 1.限制每个上传文件的最大长度。<br />	// su.setMaxFileSize(10000);<br />	// 2.限制总上传数据的长度。<br />	// su.setTotalMaxFileSize(20000);<br />	// 3.设定允许上传的文件（通过扩展名限制）,仅允许doc,txt文件。<br />	// su.setAllowedFilesList("doc,txt");<br />	// 4.设定禁止上传的文件（通过扩展名限制）,禁止上传带有exe,bat,<br />	jsp,htm,html扩展名的文件和没有扩展名的文件。<br />	// su.setDeniedFilesList("exe,bat,jsp,htm,html,,");<br />	// 上传文件<br />	su.upload();<br />	// 将上传文件全部保存到指定目录<br />	int count = su.save("/upload");<br />	out.println(count+"个文件上传成功！&lt;br&gt;");<br /><br />	// 利用Request对象获取参数之值<br />	out.println("TEST="+su.getRequest().getParameter("TEST")<br />	+"&lt;BR&gt;&lt;BR&gt;");<br /><br />	// 逐一提取上传文件信息，同时可保存文件。<br />	for (int i=0;i&lt;su.getFiles().getCount();i++)<br />	{<br />		com.jspsmart.upload.File file = su.getFiles().getFile(i);<br /><br />		// 若文件不存在则继续<br />		if (file.isMissing()) continue;<br /><br />		// 显示当前文件信息<br />		out.println("&lt;TABLE BORDER=1&gt;");<br />		out.println("&lt;TR&gt;&lt;TD&gt;表单项名（FieldName）&lt;/TD&gt;&lt;TD&gt;"<br />		+ file.getFieldName() + "&lt;/TD&gt;&lt;/TR&gt;");<br />		out.println("&lt;TR&gt;&lt;TD&gt;文件长度（Size）&lt;/TD&gt;&lt;TD&gt;" + <br />		file.getSize() + "&lt;/TD&gt;&lt;/TR&gt;");<br />		out.println("&lt;TR&gt;&lt;TD&gt;文件名（FileName）&lt;/TD&gt;&lt;TD&gt;" <br />		+ file.getFileName() + "&lt;/TD&gt;&lt;/TR&gt;");<br />		out.println("&lt;TR&gt;&lt;TD&gt;文件扩展名（FileExt）&lt;/TD&gt;&lt;TD&gt;" <br />		+ file.getFileExt() + "&lt;/TD&gt;&lt;/TR&gt;");<br />		out.println("&lt;TR&gt;&lt;TD&gt;文件全名（FilePathName）&lt;/TD&gt;&lt;TD&gt;"<br />		+ file.getFilePathName() + "&lt;/TD&gt;&lt;/TR&gt;");<br />		out.println("&lt;/TABLE&gt;&lt;BR&gt;");<br /><br />		// 将文件另存<br />		// file.saveAs("/upload/" + myFile.getFileName());<br />		// 另存到以WEB应用程序的根目录为文件根目录的目录下<br />		// file.saveAs("/upload/" + myFile.getFileName(), <br />		su.SAVE_VIRTUAL);<br />		// 另存到操作系统的根目录为文件根目录的目录下<br />		// file.saveAs("c:\\temp\\" + myFile.getFileName(), <br />		su.SAVE_PHYSICAL);<br /><br />	}<br />%&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;
																</ccid_code>
																</font>
														</pre>
												</td>
										</tr>
								</tbody>
						</table>
						<br />
						<br />
						<font size="2">
								<b>四、文件下载篇</b>
								<br />
								<br />
								<b>1、下载链接页面download.html</b>
								<br />
								<br />页面源码如下： <br /><br /><ccid_nobr></ccid_nobr></font>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" bgcolor="#e6e6e6">
														<pre>
																<font size="2">
																		<ccid_code>
																		&lt;!--<br />		文件名：download.html<br />	作  者：纵横软件制作中心雨亦奇(zhsoft88@sohu.com)<br />--&gt;<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;下载&lt;/title&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;a href="jsp/do_download.jsp"&gt;点击下载&lt;/a&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;
																</ccid_code>
																</font>
														</pre>
												</td>
										</tr>
								</tbody>
						</table>
						<br />
						<br />
						<font size="2">
								<b>2、下载处理页面do_download.jsp</b> do_download.jsp展示了如何利用jspSmartUpload组件来下载文件，从下面的源码中就可以看到，下载何其简单。 <br /><br />源码如下： <br /><br /><ccid_nobr></ccid_nobr></font>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" bgcolor="#e6e6e6">
														<pre>
																<font size="2">
																		<ccid_code>
																		&lt;%@ page contentType="text/html;charset=gb2312" <br />import="com.jspsmart.upload.*" %&gt;&lt;%<br />		// 新建一个SmartUpload对象<br />	SmartUpload su = new SmartUpload();<br />		// 初始化<br />	su.initialize(pageContext);<br />		// 设定contentDisposition为null以禁止浏览器自动打开文件，<br />		//保证点击链接后是下载文件。若不设定，则下载的文件扩展名为<br />		//doc时，浏览器将自动用word打开它。扩展名为pdf时，<br />		//浏览器将用acrobat打开。<br />	su.setContentDisposition(null);<br />		// 下载文件<br />	su.downloadFile("/upload/如何赚取我的第一桶金.doc");<br />%&gt;
																</ccid_code>
																</font>
														</pre>
												</td>
										</tr>
								</tbody>
						</table>
						<br />
						<br />
						<ccid_code>
								<font size="2">注意，执行下载的页面，在Java脚本范围外（即&lt;% ... %&gt;之外），不要包含HTML代码、空格、回车或换行等字符，有的话将不能正确下载。不信的话，可以在上述源码中%&gt;&lt;%之间加入一个换行符，再下载一下，保证出错。因为它影响了返回给浏览器的数据流，导致解析出错。 </font>
						</ccid_code>
						<br />
						<br />
						<b>3、如何下载中文文件</b>
						<br />
						<br />jspSmartUpload虽然能下载文件，但对中文支持不足。若下载的文件名中有汉字，则浏览器在提示另存的文件名时，显示的是一堆乱码，很扫人兴。上面的例子就是这样。（这个问题也是众多下载组件所存在的问题，很少有人解决，搜索不到相关资料，可叹！） <br /><br />为了给jspSmartUpload组件增加下载中文文件的支持，我对该组件进行了研究，发现对返回给浏览器的另存文件名进行UTF-8编码后，浏览器便能正确显示中文名字了。这是一个令人高兴的发现。于是我对jspSmartUpload组件的SmartUpload类做了升级处理，增加了 toUtf8String这个方法，改动部分源码如下： <br /><br /><ccid_nobr></ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code><font size="2">public void downloadFile(String s, String s1, String s2, int i)<br />	throws ServletException, IOException, SmartUploadException<br />    {<br />	if(s == null)<br />	    throw new IllegalArgumentException("File '" + s +<br />	    "' not found (1040).");<br />	if(s.equals(""))<br />	    throw new IllegalArgumentException("File '" + s +<br />	    "' not found (1040).");<br />	if(!isVirtual(s) &amp;&amp; m_denyPhysicalPath)<br />	    throw new SecurityException("Physical path is<br />	    denied (1035).");<br />	if(isVirtual(s))<br />	    s = m_application.getRealPath(s);<br />	java.io.File file = new java.io.File(s);<br />	FileInputStream fileinputstream = new FileInputStream(file);<br />	long l = file.length();<br />	boolean flag = false;<br />	int k = 0;<br />	byte abyte0[] = new byte[i];<br />	if(s1 == null)<br />	    m_response.setContentType("application/x-msdownload");<br />	else<br />	if(s1.length() == 0)<br />	    m_response.setContentType("application/x-msdownload");<br />	else<br />	    m_response.setContentType(s1);<br />	m_response.setContentLength((int)l);<br />	m_contentDisposition = m_contentDisposition != null ?<br />	m_contentDisposition : "attachment;";<br />	if(s2 == null)<br />	    m_response.setHeader("Content-Disposition", <br />	    m_contentDisposition + " filename=" + <br />	    toUtf8String(getFileName(s)));<br />	else<br />	if(s2.length() == 0)<br />	    m_response.setHeader("Content-Disposition", <br />	    m_contentDisposition);<br />	else<br />	    m_response.setHeader("Content-Disposition", <br />	    m_contentDisposition + " filename=" + toUtf8String(s2));<br />	while((long)k &lt; l)<br />	{<br />	    int j = fileinputstream.read(abyte0, 0, i);<br />	    k += j;<br />	    m_response.getOutputStream().write(abyte0, 0, j);<br />	}<br />	fileinputstream.close();<br />    }<br /><br />    /**<br />     * 将文件名中的汉字转为UTF8编码的串,以便下载时能正确显示另存的文件名.<br />     * 纵横软件制作中心雨亦奇2003.08.01<br />     * @param s 原文件名<br />     * @return 重新编码后的文件名<br />     */<br />    public static String toUtf8String(String s) {<br />	StringBuffer sb = new StringBuffer();<br />	for (int i=0;i&lt;s.length();i++) {<br />	    char c = s.charAt(i);<br />	    if (c &gt;= 0 &amp;&amp; c &lt;= 255) {<br />		sb.append(c);<br />	    } else {<br />		byte[] b;<br />		try {<br />		    b = Character.toString(c).getBytes("utf-8");<br />		} catch (Exception ex) {<br />		    System.out.println(ex);<br />		    b = new byte[0];<br />		}<br />		for (int j = 0; j &lt; b.length; j++) {<br />		    int k = b[j];<br />		    if (k &lt; 0) k += 256;<br />		    sb.append("%" + Integer.toHexString(k).<br />		    toUpperCase());<br />		}<br />	    }<br />	}<br />	return sb.toString();<br />    }</font></ccid_code></pre></td></tr></tbody></table><br /><br /><font size="2">注意源码中粗体部分，原jspSmartUpload组件对返回的文件未作任何处理，现在做了编码的转换工作，将文件名转换为UTF-8形式的编码形式。 UTF-8编码对英文未作任何处理，对中文则需要转换为%XX的形式。toUtf8String方法中，直接利用Java语言提供的编码转换方法获得汉字字符的UTF-8编码，之后将其转换为%XX的形式。 <br /><br />将源码编译后打包成jspSmartUpload.jar，拷贝到Tomcat 的shared/lib目录下（可为所有WEB应用程序所共享），然后重启Tomcat服务器就可以正常下载含有中文名字的文件了。另， toUtf8String方法也可用于转换含有中文的超级链接，以保证链接的有效，因为有的WEB服务器不支持中文链接。 <br /><br />小结：jspSmartUpload组件是应用JSP进行B/S程序开发过程中经常使用的上传下载组件，它使用简单，方便。现在我又为其加上了下载中文名字的文件的支持，真个是如虎添翼，必将赢得更多开发者的青睐。</font></span>
				<font size="2">
				</font>
		</span>
<img src ="http://www.blogjava.net/yaozhuan/aggbug/37496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaozhuan/" target="_blank">砖头</a> 2006-03-26 20:22 <a href="http://www.blogjava.net/yaozhuan/articles/37496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>