<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ursob &#187; Struts</title>
	<atom:link href="http://ursob.org/tag/struts/feed/" rel="self" type="application/rss+xml" />
	<link>http://ursob.org</link>
	<description>Code &#38;&#38; Riff</description>
	<lastBuildDate>Thu, 02 Sep 2010 11:58:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Win下批处理部署J2EE工程</title>
		<link>http://ursob.org/2010/07/29/windows-bat-j2ee/</link>
		<comments>http://ursob.org/2010/07/29/windows-bat-j2ee/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 09:09:49 +0000</pubDate>
		<dc:creator>ripflowers</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Others]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Struts]]></category>

		<guid isPermaLink="false">http://ursob.org/?p=406</guid>
		<description><![CDATA[
前段时间需要弄一个自动安装J2EE工程的东西，想到用installanywhere，不过还想用更简单的方法，所以就用到了用批处理文件部署J2EE项目，用到的数据库为Mysql，原理很简单就是把注册Mysql服务、启动Tomcat、配置JAVA_HOME、配置PATH这些命令都堆到了一个bat文件下，原来一牛逼哥们儿已经实现了放到硬盘的固定目录下实现这样的功能，之后在本人的狗尾续貂下已经实现放到硬盘的任务目录都能执行，下边记录一下总过程:



1，文件准备，文件目录如下图：





相信看到这几个文件都不会陌生，这几个文件的重点就在于startup.bat，这个文件中聚集了所有的命令，jdk就不说了；mysql为noinstall版本，数据库已经创建完毕，并且已经导入数据，如果noinstall-mysql还有疑问的话请参考本站的Mysql noinstall版本的配置和使用；tomcat的webapps下已经放置了将要部署的项目；index.html中的内容为：


&#60;html&#62;
  &#60;head&#62;&#60;/head&#62;
  &#60;body&#62;
    &#60;script&#62;window.location.href='http://localhost:8088/项目名称';&#60;/script&#62;
  &#60;/body&#62;
&#60;/html&#62;
&#60;!--不再赘述--&#62;





2，startup.bat详解，一下是bat文件中的全部内容，注释中会说的更明白一点：


&#160;
@echo off
rem echo off命令关闭命令在dos窗口中的显示，如果需要显示修改为echo on
rem @echo off行的上面最好空一行，因为测试发现如果它放到第一行的话有时候会失效

rem 以下两行代码的功能是获取当前路径，并把当前路径付给变量&#34;INSTALL_HOME&#34;
setlocal enabledelayedexpansion
set &#34;INSTALL_HOME=%~dp0&#34;

rem 以下三行代码的功能是清空mysql目录下my.ini中的内容，
rem 因为路径是可变的，所以需要修改my.ini中的内容，
rem 向文件中插入内容好像不是很容易实现，所以干脆全部清空，然后再向中写数据
for /f &#34;delims=&#34; %%i in &#40;'dir/b &#34;%INSTALL_HOME%\mysql\my.ini&#34;'&#41; do call :del_ &#34;%%i&#34; 
goto :eof 
:del_ 

rem 以下N行代码的功能配置my.ini
&#62;c:\tmp1.tmp &#40;
	echo &#91;WinMySQLAdmin&#93; 
	echo Server=%INSTALL_HOME%\mysql\mysqld-nt.exe
	echo &#91;mysqld&#93; 
	echo basedir=%INSTALL_HOME%\mysql
	echo datadir=%INSTALL_HOME%\mysql\data
	echo &#91;client&#93;
	echo port		= 3306
	echo socket		= /tmp/mysql.sock
	echo default-character-set=utf8
	echo &#91;mysqld&#93;
	echo port		= [...]]]></description>
			<content:encoded><![CDATA[<p>
前段时间需要弄一个自动安装J2EE工程的东西，想到用installanywhere，不过还想用更简单的方法，所以就用到了用批处理文件部署J2EE项目，用到的数据库为Mysql，原理很简单就是把注册Mysql服务、启动Tomcat、配置JAVA_HOME、配置PATH这些命令都堆到了一个bat文件下，原来一牛逼哥们儿已经实现了放到硬盘的固定目录下实现这样的功能，之后在本人的狗尾续貂下已经实现放到硬盘的任务目录都能执行，下边记录一下总过程:
</p>
<blockquote>
<p>
1，文件准备，文件目录如下图：
</p>
<p>
<a title="Image Title" rel="lightbox" href="http://ursob.org/wp-content/uploads/2010/06/files.jpg"><img src="http://ursob.org/wp-content/uploads/2010/06/files.jpg" alt="Key documents" title="Key documents" width="300" height="187" class="size-medium wp-image-364" /></a>
</p>
<p>
相信看到这几个文件都不会陌生，这几个文件的重点就在于startup.bat，这个文件中聚集了所有的命令，jdk就不说了；mysql为noinstall版本，数据库已经创建完毕，并且已经导入数据，如果noinstall-mysql还有疑问的话请参考本站的<a title="Permanent Link to Mysql noinstall版本的配置和使用" rel="bookmark" href="http://ursob.org/2009/09/30/mysql-noinstall/">Mysql noinstall版本的配置和使用</a>；tomcat的webapps下已经放置了将要部署的项目；index.html中的内容为：
</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:Courier New, Courier;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span>&gt;</span>window.location.href='http://localhost:8088/项目名称';<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">html</span>&gt;</span>
<span style="color: #808080; font-style: italic;">&lt;!--不再赘述--&gt;</span></pre></div></div>

</p>
</blockquote>
<blockquote>
<p>
2，startup.bat详解，一下是bat文件中的全部内容，注释中会说的更明白一点：
</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:Courier New, Courier;">&nbsp;
<span style="color: #33cc33;">@</span><span style="color: #b1b100; font-weight: bold;">echo</span> off
<span style="color: #808080; font-style: italic;">rem echo off命令关闭命令在dos窗口中的显示，如果需要显示修改为echo on</span>
<span style="color: #808080; font-style: italic;">rem @echo off行的上面最好空一行，因为测试发现如果它放到第一行的话有时候会失效</span>
<span style="color: #808080; font-style: italic;">
rem 以下两行代码的功能是获取当前路径，并把当前路径付给变量&quot;INSTALL_HOME&quot;</span>
<span style="color: #b1b100; font-weight: bold;">setlocal</span> enabledelayedexpansion
<span style="color: #b1b100; font-weight: bold;">set</span> <span style="color: #448844;">&quot;INSTALL_HOME</span>=<span style="color: #33cc33;">%</span><span style="color: #448888;">~dp0</span>&quot;
<span style="color: #808080; font-style: italic;">
rem 以下三行代码的功能是清空mysql目录下my.ini中的内容，</span>
<span style="color: #808080; font-style: italic;">rem 因为路径是可变的，所以需要修改my.ini中的内容，</span>
<span style="color: #808080; font-style: italic;">rem 向文件中插入内容好像不是很容易实现，所以干脆全部清空，然后再向中写数据</span>
<span style="color: #00b100; font-weight: bold;">for</span> /f &quot;delims=&quot; <span style="color: #33cc33;">%%</span><span style="color: #448888;">i</span> <span style="color: #00b100; font-weight: bold;">in</span> <span style="color: #66cc66;">&#40;</span>'<span style="color: #b1b100; font-weight: bold;">dir</span>/b &quot;<span style="color: #33cc33;">%</span><span style="color: #448888;">INSTALL_HOME</span><span style="color: #33cc33;">%</span>\mysql\my.ini&quot;'<span style="color: #66cc66;">&#41;</span> <span style="color: #00b100; font-weight: bold;">do</span> <span style="color: #00b100; font-weight: bold;">call</span> :<span style="color: #b100b1; font-weight: bold;">del_ &quot;%%<span style="color: #448888;">i</span>&quot; </span>
<span style="color: #00b100; font-weight: bold;">goto</span> <span style="color: #b100b1; font-weight: bold;">:eof </span>
:<span style="color: #b100b1; font-weight: bold;">del_ </span>
<span style="color: #808080; font-style: italic;">
rem 以下N行代码的功能配置my.ini</span>
&gt;c:\tmp1.tmp <span style="color: #66cc66;">&#40;</span>
	<span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #66cc66;">&#91;</span>WinMySQLAdmin<span style="color: #66cc66;">&#93;</span> 
	<span style="color: #b1b100; font-weight: bold;">echo</span> Server=<span style="color: #33cc33;">%</span><span style="color: #448888;">INSTALL_HOME</span><span style="color: #33cc33;">%</span>\mysql\mysqld-nt.exe
	<span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #66cc66;">&#91;</span>mysqld<span style="color: #66cc66;">&#93;</span> 
	<span style="color: #b1b100; font-weight: bold;">echo</span> basedir=<span style="color: #33cc33;">%</span><span style="color: #448888;">INSTALL_HOME</span><span style="color: #33cc33;">%</span>\mysql
	<span style="color: #b1b100; font-weight: bold;">echo</span> datadir=<span style="color: #33cc33;">%</span><span style="color: #448888;">INSTALL_HOME</span><span style="color: #33cc33;">%</span>\mysql\data
	<span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #66cc66;">&#91;</span>client<span style="color: #66cc66;">&#93;</span>
	<span style="color: #b1b100; font-weight: bold;">echo</span> port		= <span style="color: #cc66cc;">3306</span>
	<span style="color: #b1b100; font-weight: bold;">echo</span> socket		= /tmp/mysql.sock
	<span style="color: #b1b100; font-weight: bold;">echo</span> default-character-<span style="color: #b1b100; font-weight: bold;">set</span>=utf8
	<span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #66cc66;">&#91;</span>mysqld<span style="color: #66cc66;">&#93;</span>
	<span style="color: #b1b100; font-weight: bold;">echo</span> port		= <span style="color: #cc66cc;">3306</span>
	<span style="color: #b1b100; font-weight: bold;">echo</span> socket		= /tmp/mysql.sock
	<span style="color: #b1b100; font-weight: bold;">echo</span> skip-locking
	<span style="color: #b1b100; font-weight: bold;">echo</span> key_buffer = 16K
	<span style="color: #b1b100; font-weight: bold;">echo</span> max_allowed_packet = 12M
	<span style="color: #b1b100; font-weight: bold;">echo</span> table_cache = <span style="color: #cc66cc;">4</span>
	<span style="color: #b1b100; font-weight: bold;">echo</span> sort_buffer_size = 64K
	<span style="color: #b1b100; font-weight: bold;">echo</span> read_buffer_size = 256K
	<span style="color: #b1b100; font-weight: bold;">echo</span> read_rnd_buffer_size = 256K
	<span style="color: #b1b100; font-weight: bold;">echo</span> net_buffer_length = 2K
	<span style="color: #b1b100; font-weight: bold;">echo</span> thread_stack = 64K
	<span style="color: #b1b100; font-weight: bold;">echo</span> default-character-<span style="color: #b1b100; font-weight: bold;">set</span>=utf8
	<span style="color: #b1b100; font-weight: bold;">echo</span> default-storage-engine=innodb
	<span style="color: #b1b100; font-weight: bold;">echo</span> server-id	= <span style="color: #cc66cc;">1</span>
	<span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #66cc66;">&#91;</span>mysqldump<span style="color: #66cc66;">&#93;</span>
	<span style="color: #b1b100; font-weight: bold;">echo</span> quick
	<span style="color: #b1b100; font-weight: bold;">echo</span> max_allowed_packet = 16M
	<span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #66cc66;">&#91;</span>mysql<span style="color: #66cc66;">&#93;</span>
	<span style="color: #b1b100; font-weight: bold;">echo</span> no-auto-rehash
	<span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #66cc66;">&#91;</span>isamchk<span style="color: #66cc66;">&#93;</span>
	<span style="color: #b1b100; font-weight: bold;">echo</span> key_buffer = 8M
	<span style="color: #b1b100; font-weight: bold;">echo</span> sort_buffer_size = 8M
	<span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #66cc66;">&#91;</span>myisamchk<span style="color: #66cc66;">&#93;</span>
	<span style="color: #b1b100; font-weight: bold;">echo</span> key_buffer = 8M
	<span style="color: #b1b100; font-weight: bold;">echo</span> sort_buffer_size = 8M
	<span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #66cc66;">&#91;</span>mysqlhotcopy<span style="color: #66cc66;">&#93;</span>
	<span style="color: #b1b100; font-weight: bold;">echo</span> interactive-timeout
<span style="color: #66cc66;">&#41;</span>
<span style="color: #00b100; font-weight: bold;">for</span> /f &quot;tokens=* delims=&quot; <span style="color: #33cc33;">%%</span><span style="color: #448888;">i</span> <span style="color: #00b100; font-weight: bold;">in</span> <span style="color: #66cc66;">&#40;</span>'<span style="color: #b1b100; font-weight: bold;">dir</span> /b <span style="color: #33cc33;">%</span><span style="color: #448888;">INSTALL_HOME</span><span style="color: #33cc33;">%</span>\mysql\my.ini'<span style="color: #66cc66;">&#41;</span> <span style="color: #00b100; font-weight: bold;">do</span> <span style="color: #66cc66;">&#40;</span>
	<span style="color: #b1b100; font-weight: bold;">copy</span> c:\tmp1.tmp+&quot;<span style="color: #33cc33;">%</span><span style="color: #448888;">INSTALL_HOME</span><span style="color: #33cc33;">%</span>\mysql\<span style="color: #33cc33;">%%</span><span style="color: #448888;">i</span>&quot; c:\tmp2.tmp /y &gt;<span style="color: #0000ff; font-weight: bold;">nul</span>
	<span style="color: #b1b100; font-weight: bold;">copy</span> c:\tmp2.tmp &quot;<span style="color: #33cc33;">%</span><span style="color: #448888;">INSTALL_HOME</span><span style="color: #33cc33;">%</span>\mysql\<span style="color: #33cc33;">%%</span><span style="color: #448888;">i</span>&quot; /y &gt;<span style="color: #0000ff; font-weight: bold;">nul</span>
<span style="color: #66cc66;">&#41;</span>
<span style="color: #b1b100; font-weight: bold;">del</span> c:\tmp1.tmp /f /q
<span style="color: #b1b100; font-weight: bold;">del</span> c:\tmp2.tmp /f /q
<span style="color: #808080; font-style: italic;">
rem 设置PATH、CLASSPATH、CATALINA_HOME、JAVA_HOME，</span>
<span style="color: #808080; font-style: italic;">rem 其中路径都是相对于“INSTALL_HOME”的，可见获取这个路径的重要性</span>
<span style="color: #b1b100; font-weight: bold;">set</span> <span style="color: #448844;">PATH</span>=<span style="color: #33cc33;">%</span><span style="color: #448888;">INSTALL_HOME</span><span style="color: #33cc33;">%</span>\jdk\bin;<span style="color: #33cc33;">%</span><span style="color: #448888;">PATH</span><span style="color: #33cc33;">%</span>
<span style="color: #b1b100; font-weight: bold;">set</span> <span style="color: #448844;">CLASSPATH</span>=<span style="color: #33cc33;">%</span><span style="color: #448888;">INSTALL_HOME</span><span style="color: #33cc33;">%</span>\jdk\jre\lib\rt.jar;.
<span style="color: #b1b100; font-weight: bold;">set</span> <span style="color: #448844;">CATALINA_HOME</span>=<span style="color: #33cc33;">%</span><span style="color: #448888;">INSTALL_HOME</span><span style="color: #33cc33;">%</span>\tomcat
<span style="color: #b1b100; font-weight: bold;">set</span> <span style="color: #448844;">JAVA_HOME</span>=<span style="color: #33cc33;">%</span><span style="color: #448888;">INSTALL_HOME</span><span style="color: #33cc33;">%</span>\jdk
<span style="color: #808080; font-style: italic;">
rem 在测试中得知sc命令有时候在运用时，需要依赖telnet服务，</span>
<span style="color: #808080; font-style: italic;">rem 所以将telnet服务设置为自动并且启动它</span>
sc config TlntSvr start= auto 
net start telnet
<span style="color: #808080; font-style: italic;">
rem &quot;noinstallmysql&quot;是将要注册的mysql服务名称，</span>
<span style="color: #808080; font-style: italic;">rem 所以安全起见不管机器上有没有这个服务，先停掉，然后再删掉</span>
net stop noinstallmysql
sc delete noinstallmysql 
<span style="color: #808080; font-style: italic;">
rem 注册mysql服务，名称为“noinstallmysql”</span>
<span style="color: #808080; font-style: italic;">rem 以下两行在执行时请务必放到一行中，要不会执行出错</span>
<span style="color: #00b100; font-weight: bold;">Call</span> &quot;<span style="color: #33cc33;">%</span><span style="color: #448888;">INSTALL_HOME</span><span style="color: #33cc33;">%</span>/mysql/bin/mysqld-nt&quot; --install noinstallmysql 
                                  --defaults-file=<span style="color: #33cc33;">%</span><span style="color: #448888;">INSTALL_HOME</span><span style="color: #33cc33;">%</span>\mysql\my.ini
<span style="color: #808080; font-style: italic;">
rem 配置mysql服务，设置为自动</span>
sc config noinstallmysql start= auto
<span style="color: #808080; font-style: italic;">
rem 启动mysql服务</span>
net start noinstallmysql
<span style="color: #808080; font-style: italic;">
rem 进入tomcat下的bin目录，启动它，大功告成！</span>
<span style="color: #b1b100; font-weight: bold;">cd</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">INSTALL_HOME</span><span style="color: #33cc33;">%</span>\tomcat\bin
<span style="color: #00b100; font-weight: bold;">call</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">INSTALL_HOME</span><span style="color: #33cc33;">%</span>\tomcat\bin\startup.bat</pre></div></div>

</p>
<p>
启动成功之后，还记得那个index.html吗，直接点击就可以进入你的项目，如果启动不成功的话自己调整一下或者mail给我一起交流都可以。E-mail:ripflowers@gmail.com，OK，下班走人。
</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://ursob.org/2010/07/29/windows-bat-j2ee/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Myeclipse打开struts配置文件时报错解决办法</title>
		<link>http://ursob.org/2009/10/11/myeclipse-struts-config/</link>
		<comments>http://ursob.org/2009/10/11/myeclipse-struts-config/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 03:20:28 +0000</pubDate>
		<dc:creator>ripflowers</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[MyEclipse]]></category>
		<category><![CDATA[Struts]]></category>

		<guid isPermaLink="false">http://ursob.org/?p=192</guid>
		<description><![CDATA[我的Myeclipse版本是6.0，在打开struts配置文件的时候总是报一些错误，修改打开方式也不是很灵，下边介绍一下解决的办法。]]></description>
			<content:encoded><![CDATA[<p>我的Myeclipse版本是6.0，在打开struts配置文件的时候总是报一些错误，修改打开方式也不是很灵，下边介绍一下解决的办法。<br />
错误如下：<br />
<div id="attachment_193" class="wp-caption alignnone" style="width: 630px"><img src="http://ursob.org/wp-content/uploads/2009/10/myeclipse_error.jpg" alt="myeclipse报错" title="myeclipse_error" width="620" height="401" class="size-full wp-image-193" /><p class="wp-caption-text">myeclipse报错</p></div><br />
解决办法：<br />
打开项目中的.project文件，在<natures>节点下添加一个<nature>节点，内容如下：</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:Courier New, Courier;"><span style="color: #ddbb00;">&amp;lt;</span>nature<span style="color: #ddbb00;">&amp;gt;</span>
com.genuitec.eclipse.cross.easystruts.eclipse.easystrutsnature
<span style="color: #ddbb00;">&amp;lt;</span>/nature<span style="color: #ddbb00;">&amp;gt;</span></pre></div></div>

<p>保存之后，问题即可解决，当在打开配置文件的时候会提示你生成一个.mex文件，这个文件是struts配置文件编辑器中Design试图中要用到的，点击Ok。</p>
]]></content:encoded>
			<wfw:commentRss>http://ursob.org/2009/10/11/myeclipse-struts-config/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java文件压缩下载</title>
		<link>http://ursob.org/2009/09/25/struts-packaging-download/</link>
		<comments>http://ursob.org/2009/09/25/struts-packaging-download/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 07:25:15 +0000</pubDate>
		<dc:creator>ripflowers</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Others]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[javaWeb]]></category>
		<category><![CDATA[java文件压缩]]></category>
		<category><![CDATA[Struts]]></category>

		<guid isPermaLink="false">http://ursob.org/?p=120</guid>
		<description><![CDATA[上文书中说到struts的文件批量上传，接下来总结一下java中文件的压缩下载功能，既把文件打成压缩包然后下载，实现中使用了org.apache.tools.zip.ZipEntry以及org.apache.tools.zip.ZipOutputStream这两个主要的类，所以你的项目中必须引入ant.jar这个包，java中也自带了关于压缩文件操作的类，但之所以不用java自带的，是因为ant.jar中的操作类解决了文件名是中文的问题，也就是说java自带的那个类在处理中文名文件的时候会抛出异常，现在的版本只支持文件的打包，还不支持文件目录的打包。这里的文件压缩功能是针对java Web开发的，最重要的是解决的思路，有了思路就到那都可以解决了。]]></description>
			<content:encoded><![CDATA[<p>承接上文，上文书中说到struts的文件批量上传，接下来总结一下java中文件的压缩下载功能，既把文件打成压缩包然后下载，实现中使用了org.apache.tools.zip.ZipEntry以及org.apache.tools.zip.ZipOutputStream这两个主要的类，所以你的项目中必须引入ant.jar这个包，java中也自带了关于压缩文件操作的类，但之所以不用java自带的，是因为ant.jar中的操作类解决了文件名是中文的问题，也就是说java自带的那个类在处理中文名文件的时候会抛出异常，现在的版本只支持文件的打包，还不支持文件目录的打包。这里的文件压缩功能是针对java Web开发的，最重要的是解决的思路，有了思路就到那都可以解决了。<br />
还是用代码来说话，代码中会嵌入一些注释。</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:Courier New, Courier;"><span style="color: #66cc66;">//</span>文件打包下载
public ActionForward downLoadFiles<span style="color: #66cc66;">&#40;</span>ActionMapping mapping<span style="color: #66cc66;">,</span> ActionForm form<span style="color: #66cc66;">,</span>
		HttpServletRequest request<span style="color: #66cc66;">,</span> HttpServletResponse response<span style="color: #66cc66;">&#41;</span>
		throws Exception <span style="color: #66cc66;">&#123;</span>
	try <span style="color: #66cc66;">&#123;</span>
		<span style="color: #808080; font-style: italic;">/**这个集合就是你想要打包的所有文件，
		 * 这里假设已经准备好了所要打包的文件*/</span>
		List<span style="color: #66cc66;">&lt;</span>File<span style="color: #66cc66;">&gt;</span> files <span style="color: #66cc66;">=</span> new ArrayList<span style="color: #66cc66;">&lt;</span>File<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
		<span style="color: #808080; font-style: italic;">/**创建一个临时压缩文件，
		 * 我们会把文件流全部注入到这个文件中
		 * 这里的文件你可以自定义是.rar还是.zip*/</span>
		File file <span style="color: #66cc66;">=</span> new File<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;yourPath.rar&quot;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #66cc66;">&#40;</span>!file<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">EXISTS</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>   
            file<span style="color: #66cc66;">.</span>createNewFile<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;   
        <span style="color: #66cc66;">&#125;</span>
        <span style="color: #808080; font-style: italic;">/**要是弹出那个下载的框，
         * 就必须有下边这两项的设置了*/</span>
        response<span style="color: #66cc66;">.</span>addHeader<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Content-Disposition&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;attachment; filename=&quot;</span>
				<span style="color: #66cc66;">+</span> new String<span style="color: #66cc66;">&#40;</span>file<span style="color: #66cc66;">.</span>getName<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">.</span>getBytes<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;iso-8859-1&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		response<span style="color: #66cc66;">.</span>setContentType<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;application/octet-stream&quot;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">//</span>创建文件输出流
        FileOutputStream fous <span style="color: #66cc66;">=</span> new FileOutputStream<span style="color: #66cc66;">&#40;</span>file<span style="color: #66cc66;">&#41;</span>;   
        <span style="color: #808080; font-style: italic;">/**打包的方法我们会用到ZipOutputStream这样一个输出流,
         * 所以这里我们把输出流转换一下*/</span>
        org<span style="color: #66cc66;">.</span>apache<span style="color: #66cc66;">.</span>tools<span style="color: #66cc66;">.</span>zip<span style="color: #66cc66;">.</span>ZipOutputStream zipOut 
        	<span style="color: #66cc66;">=</span> new org<span style="color: #66cc66;">.</span>apache<span style="color: #66cc66;">.</span>tools<span style="color: #66cc66;">.</span>zip<span style="color: #66cc66;">.</span>ZipOutputStream<span style="color: #66cc66;">&#40;</span>fous<span style="color: #66cc66;">&#41;</span>;
        <span style="color: #808080; font-style: italic;">/**这个方法接受的就是一个所要打包文件的集合，
         * 还有一个ZipOutputStream*/</span>
        FileUtil<span style="color: #66cc66;">.</span>zipFile<span style="color: #66cc66;">&#40;</span>files<span style="color: #66cc66;">,</span> zipOut<span style="color: #66cc66;">&#41;</span>;
        zipOut<span style="color: #66cc66;">.</span>close<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        fous<span style="color: #66cc66;">.</span>close<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #808080; font-style: italic;">/**直到文件的打包已经成功了，
         * 文件的打包过程被我封装在FileUtil.zipFile这个静态方法中，
         * 稍后会呈现出来，接下来的就是往客户端写数据了*/</span>
        OutputStream out <span style="color: #66cc66;">=</span> response<span style="color: #66cc66;">.</span>getOutputStream<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        BufferedInputStream bin <span style="color: #66cc66;">=</span> new 
        BufferedInputStream<span style="color: #66cc66;">&#40;</span>new FileInputStream<span style="color: #66cc66;">&#40;</span>file<span style="color: #66cc66;">.</span>getPath<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
        byte<span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> buf <span style="color: #66cc66;">=</span> new byte<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1024</span><span style="color: #66cc66;">&#93;</span>;
        int len <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span>;
        while<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>len <span style="color: #66cc66;">=</span> bin<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">READ</span><span style="color: #66cc66;">&#40;</span>buf<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> 
        out<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">WRITE</span><span style="color: #66cc66;">&#40;</span>buf<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span>len<span style="color: #66cc66;">&#41;</span>;
        out<span style="color: #66cc66;">.</span>close<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        bin<span style="color: #66cc66;">.</span>close<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #808080; font-style: italic;">/**最后的操作是把创建的临时文件删除*/</span>
        try <span style="color: #66cc66;">&#123;</span>
        	File f <span style="color: #66cc66;">=</span> new File<span style="color: #66cc66;">&#40;</span>file<span style="color: #66cc66;">.</span>getPath<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
        	f<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">DELETE</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span> catch <span style="color: #66cc66;">&#40;</span>Exception e<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			e<span style="color: #66cc66;">.</span>printStackTrace<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span> catch <span style="color: #66cc66;">&#40;</span>Exception e<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		e<span style="color: #66cc66;">.</span>printStackTrace<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #993333; font-weight: bold;">RETURN</span> <span style="color: #993333; font-weight: bold;">NULL</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #993333; font-weight: bold;">RETURN</span> <span style="color: #993333; font-weight: bold;">NULL</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>下边是FileUtil中的生成rar或者是zip文件的方法：</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:Courier New, Courier;"><span style="color: #808080; font-style: italic;">/**
 * 把接受的全部文件打成压缩包 
 * @param List&lt;File&gt;;  
 * @param org.apache.tools.zip.ZipOutputStream  
 */</span>
public static void zipFile
		<span style="color: #66cc66;">&#40;</span>List files<span style="color: #66cc66;">,</span>org<span style="color: #66cc66;">.</span>apache<span style="color: #66cc66;">.</span>tools<span style="color: #66cc66;">.</span>zip<span style="color: #66cc66;">.</span>ZipOutputStream outputStream<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	int size <span style="color: #66cc66;">=</span> files<span style="color: #66cc66;">.</span>size<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #993333; font-weight: bold;">FOR</span> <span style="color: #66cc66;">&#40;</span>int i <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span>; i <span style="color: #66cc66;">&lt;</span> size; i<span style="color: #66cc66;">++</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		File file <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span>File<span style="color: #66cc66;">&#41;</span> files<span style="color: #66cc66;">.</span>get<span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span>;
		zipFile<span style="color: #66cc66;">&#40;</span>file<span style="color: #66cc66;">,</span> outputStream<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #808080; font-style: italic;">/**  
 * 根据输入的文件与输出流对文件进行打包
 * @param File
 * @param org.apache.tools.zip.ZipOutputStream
 */</span>
public static void zipFile<span style="color: #66cc66;">&#40;</span>File inputFile<span style="color: #66cc66;">,</span>
		org<span style="color: #66cc66;">.</span>apache<span style="color: #66cc66;">.</span>tools<span style="color: #66cc66;">.</span>zip<span style="color: #66cc66;">.</span>ZipOutputStream ouputStream<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	try <span style="color: #66cc66;">&#123;</span>
		<span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #66cc66;">&#40;</span>inputFile<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">EXISTS</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #808080; font-style: italic;">/**如果是目录的话这里是不采取操作的，
			 * 至于目录的打包正在研究中*/</span>
			<span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #66cc66;">&#40;</span>inputFile<span style="color: #66cc66;">.</span>isFile<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				FileInputStream <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">=</span> new FileInputStream<span style="color: #66cc66;">&#40;</span>inputFile<span style="color: #66cc66;">&#41;</span>;
				BufferedInputStream bins <span style="color: #66cc66;">=</span> new BufferedInputStream<span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">IN</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">512</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">//</span>org<span style="color: #66cc66;">.</span>apache<span style="color: #66cc66;">.</span>tools<span style="color: #66cc66;">.</span>zip<span style="color: #66cc66;">.</span>ZipEntry
				ZipEntry entry <span style="color: #66cc66;">=</span> new ZipEntry<span style="color: #66cc66;">&#40;</span>inputFile<span style="color: #66cc66;">.</span>getName<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
				ouputStream<span style="color: #66cc66;">.</span>putNextEntry<span style="color: #66cc66;">&#40;</span>entry<span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">//</span> 向压缩文件中输出数据   
				int nNumber;
				byte<span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> buffer <span style="color: #66cc66;">=</span> new byte<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">512</span><span style="color: #66cc66;">&#93;</span>;
				while <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>nNumber <span style="color: #66cc66;">=</span> bins<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">READ</span><span style="color: #66cc66;">&#40;</span>buffer<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> !<span style="color: #66cc66;">=</span> <span style="color: #66cc66;">-</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					ouputStream<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">WRITE</span><span style="color: #66cc66;">&#40;</span>buffer<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span> nNumber<span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span>
				<span style="color: #66cc66;">//</span> 关闭创建的流对象   
				bins<span style="color: #66cc66;">.</span>close<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #993333; font-weight: bold;">IN</span><span style="color: #66cc66;">.</span>close<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span> else <span style="color: #66cc66;">&#123;</span>
				try <span style="color: #66cc66;">&#123;</span>
					File<span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> files <span style="color: #66cc66;">=</span> inputFile<span style="color: #66cc66;">.</span>listFiles<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
					<span style="color: #993333; font-weight: bold;">FOR</span> <span style="color: #66cc66;">&#40;</span>int i <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span>; i <span style="color: #66cc66;">&lt;</span> files<span style="color: #66cc66;">.</span>length; i<span style="color: #66cc66;">++</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
						zipFile<span style="color: #66cc66;">&#40;</span>files<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> ouputStream<span style="color: #66cc66;">&#41;</span>;
					<span style="color: #66cc66;">&#125;</span>
				<span style="color: #66cc66;">&#125;</span> catch <span style="color: #66cc66;">&#40;</span>Exception e<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					e<span style="color: #66cc66;">.</span>printStackTrace<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span>
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span> catch <span style="color: #66cc66;">&#40;</span>Exception e<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		e<span style="color: #66cc66;">.</span>printStackTrace<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #808080; font-style: italic;">/**********************END***********************/</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://ursob.org/2009/09/25/struts-packaging-download/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Struts批量上传文件</title>
		<link>http://ursob.org/2009/09/22/struts-batchupload/</link>
		<comments>http://ursob.org/2009/09/22/struts-batchupload/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 08:36:13 +0000</pubDate>
		<dc:creator>ripflowers</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Others]]></category>
		<category><![CDATA[Struts]]></category>
		<category><![CDATA[文件上传]]></category>

		<guid isPermaLink="false">http://ursob.org/?p=66</guid>
		<description><![CDATA[前段时间公司项目中需要做一个酷似163网盘功能的一个文件资源中心的东西，其中涉及到struts批量上传文件的功能，下边总结一下。]]></description>
			<content:encoded><![CDATA[<p>前段时间公司项目中需要做一个酷似163网盘功能的一个文件资源中心的东西，其中涉及到struts批量上传文件的功能，下边总结一下。<br />
第一步，前台实现。前台选择文件功能使用了在网上流传已久的“仿163网盘无刷新上传”的一个js控件，这个控件有针对jsp上传的版本，配置起来也比较简单。google一下就可以找到，如果懒得找也可以ripflowers@gmail.com给我，我会尽快发给你。jsp上的form我使用了“hmtl:form”，用普通的form好像传不到服务器，这里我也有一点疑问，经刘兄提醒应该是普通的form下面的type=&#8221;file&#8221;不能转换成Struts中的FormFile，关于这个问题以后再研究。</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:Courier New, Courier;">&lt;!--jsp上的form，这里一定要设置“enctype”--&gt;
&lt;html:form action=&quot;upload.do?method=upload&quot;  
	method=&quot;post&quot; enctype=&quot;multipart/form-data&gt;</pre></div></div>

<p>关于前台的实现就不再废话了，整体实现的效果如下：<br />
<img src="http://ursob.org/wp-content/uploads/2009/09/upload-300x107.jpg" alt="upload" title="upload" width="300" height="107" class="alignnone size-medium wp-image-67" /><br />
第二步，跟前台选择的文件对应的应该要有一个ActionForm，ActionFrom中要放置一个存放FormFile的集合，这样才能够实现文件的批量上传。ActionForm内容如下：</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:Courier New, Courier;">public class BatchUploadForm extends ActionForm <span style="color: #66cc66;">&#123;</span>
	private FormFile file;
	<span style="color: #66cc66;">//</span> 多附件上传这里应该是一个集合，所以这里用了List
	private List<span style="color: #66cc66;">&lt;</span>FormFile<span style="color: #66cc66;">&gt;</span> myFiles;
	public BatchUploadForm<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		myFiles <span style="color: #66cc66;">=</span> new ArrayList<span style="color: #66cc66;">&lt;</span>FormFile<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">//</span> 为了能够在页面初始显示一个file
		myFiles<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">ADD</span><span style="color: #66cc66;">&#40;</span>file<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
	public List<span style="color: #66cc66;">&lt;</span>FormFile<span style="color: #66cc66;">&gt;</span> getMyFiles<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #993333; font-weight: bold;">RETURN</span> myFiles;
	<span style="color: #66cc66;">&#125;</span>
	public void setMyFiles<span style="color: #66cc66;">&#40;</span>List<span style="color: #66cc66;">&lt;</span>FormFile<span style="color: #66cc66;">&gt;</span> myFiles<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		this<span style="color: #66cc66;">.</span>myFiles <span style="color: #66cc66;">=</span> myFiles;
	<span style="color: #66cc66;">&#125;</span>
	public FormFile getFile<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #993333; font-weight: bold;">RETURN</span> file;
	<span style="color: #66cc66;">&#125;</span>
	public void setFile<span style="color: #66cc66;">&#40;</span>FormFile<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		this<span style="color: #66cc66;">.</span>file <span style="color: #66cc66;">=</span> file;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>第三步，设置struts的配置文件，我的配置文件内容如下：</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:Courier New, Courier;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #00bbdd;">&lt;!DOCTYPE struts-config SYSTEM &quot;../struts-config_1_2.dtd&quot;&gt;</span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;struts-config<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;form-beans<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	    <span style="color: #808080; font-style: italic;">&lt;!--这里配置的Form替换成你的package--&gt;</span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;form-bean</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;batchUploadForm&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;BatchUploadForm&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/form-beans<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;action-mappings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #808080; font-style: italic;">&lt;!--这里要替换成你的Aciton和你的Forward,</span>
<span style="color: #808080; font-style: italic;">		                      batchUploadForm一定要配置，</span>
<span style="color: #808080; font-style: italic;">		                      既第二步中的ActionForm--&gt;</span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;action</span> <span style="color: #000066;">path</span>=<span style="color: #ff0000;">&quot;/upload&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;ResourceAction&quot;</span>				 <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;batchUploadForm&quot;</span></span>
<span style="color: #009900;">			 <span style="color: #000066;">parameter</span>=<span style="color: #ff0000;">&quot;method&quot;</span> </span>
<span style="color: #009900;">			 <span style="color: #000066;">scope</span>=<span style="color: #ff0000;">&quot;request&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;forward</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;success&quot;</span> <span style="color: #000066;">path</span>=<span style="color: #ff0000;">&quot;&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/action<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/action-mappings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/struts-config<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>花开两朵，咱各表一枝，所有的准备工作已经做的差不多了，接下来我们来看Action中的写法，Action中接收文件的方法是敝人从网上抄来的，还没有来得及更深入的理解，先贴出来看，朋友们有什么高见尽管提出来。<br />
第四步，Action中upload方法的实现。</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:Courier New, Courier;"><span style="color: #66cc66;">//</span> 文件上传
public ActionForward upload<span style="color: #66cc66;">&#40;</span>ActionMapping mapping<span style="color: #66cc66;">,</span> ActionForm form<span style="color: #66cc66;">,</span>
		HttpServletRequest request<span style="color: #66cc66;">,</span> HttpServletResponse response<span style="color: #66cc66;">&#41;</span>
		throws Exception <span style="color: #66cc66;">&#123;</span>
&nbsp;
	BatchUploadForm uploadForm <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span>BatchUploadForm<span style="color: #66cc66;">&#41;</span> form;
	<span style="color: #66cc66;">//</span> 这里是你文件上传的目标地址
	String uploadPath <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;&quot;</span>;
	<span style="color: #808080; font-style: italic;">/*
	 * 从Form中得到所有文件类型的元素， 返回的是一个Hashtable
	 */</span>
	Hashtable files <span style="color: #66cc66;">=</span> uploadForm<span style="color: #66cc66;">.</span>getMultipartRequestHandler<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #66cc66;">.</span>getFileElements<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">//</span> 循环得到所有的FormFile
	<span style="color: #993333; font-weight: bold;">FOR</span> <span style="color: #66cc66;">&#40;</span>Map<span style="color: #66cc66;">.</span>Entry<span style="color: #66cc66;">&lt;</span>String<span style="color: #66cc66;">,</span> FormFile<span style="color: #66cc66;">&gt;</span> entry : 
		<span style="color: #66cc66;">&#40;</span>Set<span style="color: #66cc66;">&lt;</span>Map<span style="color: #66cc66;">.</span>Entry<span style="color: #66cc66;">&lt;</span>String<span style="color: #66cc66;">,</span> FormFile<span style="color: #66cc66;">&gt;&gt;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>files<span style="color: #66cc66;">.</span>entrySet<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		FormFile ff <span style="color: #66cc66;">=</span> entry<span style="color: #66cc66;">.</span>getValue<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #808080; font-style: italic;">/*
		 * 这里的Files是我的一个实体bean 用来存储文件的路径等信息
		 */</span>
		Files file <span style="color: #66cc66;">=</span> new Files<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		String fileName <span style="color: #66cc66;">=</span> ff<span style="color: #66cc66;">.</span>getFileName<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #66cc66;">&#40;</span>StringUtils<span style="color: #66cc66;">.</span>isBlank<span style="color: #66cc66;">&#40;</span>fileName<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			continue;
		<span style="color: #66cc66;">&#125;</span> else <span style="color: #66cc66;">&#123;</span>
			<span style="color: #808080; font-style: italic;">/*
			 * 为避免上传的文件重名， 这里给文件生成随机的名称
			 */</span>
			String objId <span style="color: #66cc66;">=</span> UUID<span style="color: #66cc66;">.</span>randomUUID<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">.</span>toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">//</span> 得到文件的扩展名
			String extendName <span style="color: #66cc66;">=</span> fileName<span style="color: #66cc66;">.</span>substring<span style="color: #66cc66;">&#40;</span>fileName
			<span style="color: #66cc66;">.</span>lastIndexOf<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;.&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
			uploadPath <span style="color: #66cc66;">+=</span> <span style="color: #ff0000;">&quot;/&quot;</span> <span style="color: #66cc66;">+</span> objId <span style="color: #66cc66;">+</span> <span style="color: #ff0000;">&quot;.&quot;</span> <span style="color: #66cc66;">+</span> extendName;
			BufferedOutputStream outStream <span style="color: #66cc66;">=</span> new BufferedOutputStream<span style="color: #66cc66;">&#40;</span>
			new FileOutputStream<span style="color: #66cc66;">&#40;</span>uploadPath<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
			BufferedInputStream inputStream <span style="color: #66cc66;">=</span> new BufferedInputStream<span style="color: #66cc66;">&#40;</span>ff
			<span style="color: #66cc66;">.</span>getInputStream<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #808080; font-style: italic;">/*
			 * 这里的FileUtil是一个将文件流写到硬盘 的一个工具类，内容见下
			 */</span>
			<span style="color: #66cc66;">//</span> 保存文件到服务器
			FileUtil<span style="color: #66cc66;">.</span>createFile<span style="color: #66cc66;">&#40;</span>inputStream<span style="color: #66cc66;">,</span> outStream<span style="color: #66cc66;">&#41;</span>;
			<span style="color: #808080; font-style: italic;">/**
			 * 关于文件的基本信息 这里已经全部可以获取了， 怎么样保存就看你了！
			 */</span>
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #993333; font-weight: bold;">RETURN</span> <span style="color: #993333; font-weight: bold;">NULL</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>最后把FileUtil这个简单的工具类贴出来。</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:Courier New, Courier;">public class FileUtil <span style="color: #66cc66;">&#123;</span>
	public static void createFile<span style="color: #66cc66;">&#40;</span>InputStream <span style="color: #993333; font-weight: bold;">IN</span><span style="color: #66cc66;">,</span> 
                                              OutputStream out<span style="color: #66cc66;">&#41;</span>
			throws IOException <span style="color: #66cc66;">&#123;</span>
		try <span style="color: #66cc66;">&#123;</span>
			byte<span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> bf <span style="color: #66cc66;">=</span> new byte<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1048576</span><span style="color: #66cc66;">&#93;</span>;
			int len <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">-</span><span style="color: #cc66cc;">1</span>;
			while <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>len <span style="color: #66cc66;">=</span> <span style="color: #993333; font-weight: bold;">IN</span><span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">READ</span><span style="color: #66cc66;">&#40;</span>bf<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> !<span style="color: #66cc66;">=</span> <span style="color: #66cc66;">-</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				out<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">WRITE</span><span style="color: #66cc66;">&#40;</span>bf<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span> len<span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span> catch <span style="color: #66cc66;">&#40;</span>IOException e<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			throw e;
		<span style="color: #66cc66;">&#125;</span> finally <span style="color: #66cc66;">&#123;</span>
			try <span style="color: #66cc66;">&#123;</span>
				<span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">IN</span> !<span style="color: #66cc66;">=</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">IN</span><span style="color: #66cc66;">.</span>close<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #66cc66;">&#40;</span>out <span style="color: #66cc66;">==</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span> out<span style="color: #66cc66;">.</span>close<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span> catch <span style="color: #66cc66;">&#40;</span>IOException e<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				throw e;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://ursob.org/2009/09/22/struts-batchupload/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
