?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
通过struts2提供的fileUpload拦截器可以方便的实现文g的上传。那么我们来单的实现以下Q?/span>
首先Q我们新Z个action
复制代码
1 public class ToUploadAction extends ActionSupport {
2
3 private File fileUpload;
4
5 private String fileUploadFileName;//文g的名U? 如上传的文g是a.png 则fileuploadFileNamegؓ"a.png"
6 private String fileUploadContentType;//文g的类? 如上传的是png格式的图片,则fileuploadContentTypegؓ"image/png"
7 /*
8 * 指定上传文g在服务器上的保存目录Q需要在Action中ؓ定义savePath变量qؓ其添加相应的setter和getterҎ
9 * 便于Struts2struts.xml中的<param name="savePath">uploads/</param>DlsavePath属?/span>
10 * <param>的作用就是ؓAction中的某些属性赋一个默认|通常q样做的如配|\径、文件名之类?... 传递参?/span>
11 */
12 private String savePath;//文g的保存位|? ,是在struts.xml中配|的
13
14 /**
15 *
16 */
17 private static final long serialVersionUID = 8750193097637832895L;
18
19 public String fileUpload() throws IOException{
20
21 String absolutePath = ServletActionContext.getServletContext().getRealPath(""); // 获取目根\?/span>
22 //文g路径
23 String path = absolutePath + "/" + this.savePath + "/";
24 //创徏路径Q如果目录不存在Q则创徏
25 File file = new File(path);
26 if(!file.exists()) {
27 file.mkdirs();
28 }
29 //文g路径+文g?/span>
30 path +=this.getFileUploadFileName();
31 //1.构徏输入?/span>
32 FileInputStream fis = new FileInputStream(fileUpload);
33 //2.构徏输出?/span>
34 FileOutputStream fos = new FileOutputStream(path);
35 //3.通过字节写入输出?/span>
36 try {
37 byte[] buf = new byte[1024];
38 int len = 0;
39 while ((len = fis.read(buf)) > 0) {
40 fos.write(buf, 0, len);
41 }
42 } catch (Exception e) {
43 e.printStackTrace();
44 } finally {
45 fis.close();
46 fos.close();
47 }
48 return SUCCESS;
49 }
复制代码
其中需要注意的是Q前面四个属性名U。fileUpload是通过表单传到后台的文件对象,fileUploadFileName是代表的上传文g的名Uͼ属性名必须以前面文件对象的属性名fileUpload + FileName 来命名。否则一定无法接受到参数Q不能获取文件名。同时fileUploadContentType也是同样的道理。savePathq个属性代表我们上传之后的存放地址的目录名。这个参数需要到struts.xml中进行配|,且需要命名一致?/span>
当我们的控制层完成了之后可以写我们的struts.xml配置文g。当然我们需要用到fileUploadq个拦截器:
复制代码
1 <struts>
2
3 <constant name="struts.devMode" value="true" />
4 <package name="fileUpload" extends="struts-default" namespace="/file">
5
6 <action name="fileUpload" class="com.deppon.file.ToUploadAction" method="fileUpload">
7 <interceptor-ref name="fileUpload">
8 <param name="allowedTypes">
9 image/bmp,image/png,image/gif,image/jpeg,image/jpg
10 </param>
11 <param name="maximumSize">1024*1024</param>
12 </interceptor-ref>
13 <interceptor-ref name="defaultStack" />
14 <param name="savePath">uploads</param>
15 <result name="success">/success.jsp</result>
16 <result name="input">/fileUpload.jsp</result>
17 </action>
18
19 </package>
20
21 </struts>
复制代码
我们必须也要加上struts默认的defaultStackq个拦截器,且要攑֜fileUpload拦截器的后面。这里的savePath参数配置的就是目录名Q和action中的属性对应,q样action?可以取到我们配|的文g名?/span>
最后来C我们的展C层Q?/span>
1 <s:form action="./file/fileUpload.action" method ="POST" enctype ="multipart/form-data">
2 <s:file name ="fileUpload"/>
3 <s:submit value="上传" label="upload"/>
4 </s:form>
必须提供method ?enctypeq两个属性,且不能改变,q样才能上传文g格式。这h们就基本实现了文件的上传功能。如果我们需要上传多个文Ӟ只需要修改如下属性:
1 private List<File> image;//上传的文?/span>
2 private List<String> imageFileName;//文g的名?/span>
3 private List<String> imageContentType;//文g的类?/span>
然后在方法中q行循环遍历Q同时form表单的file元素的name属性一定要全部相同Q这样struts2׃自动为我们进行处理。如下:
1 <s:file name="image" label="囄"></s:file>
2
3 <s:file name="image" label="囄"></s:file>
4
5 <s:file name="image" label="囄"></s:file>
循环遍历文g对象和文件名卛_?/span>
复制代码
1 public String fileUpload() throws IOException{
2 int i = 0;
3 for(File f : getFileUpload()){
4 String absolutePath = ServletActionContext.getServletContext().getRealPath(""); // 获取目根\?/span>
5 //文g路径
6 String path = absolutePath + "/" + this.savePath + "/";
7 //创徏路径Q如果目录不存在Q则创徏
8 File file = new File(path);
9 if(!file.exists()) {
10 file.mkdirs();
11 }
12 //文g路径+文g?/span>
13 path +=fileUploadFileName.get(i);
14 //1.构徏输入?/span>
15 FileInputStream fis = new FileInputStream(f);
16 //2.构徏输出?/span>
17 FileOutputStream fos = new FileOutputStream(path);
18 //3.通过字节写入输出?/span>
19 try {
20 byte[] buf = new byte[1024];
21 int len = 0;
22 while ((len = fis.read(buf)) > 0) {
23 fos.write(buf, 0, len);
24 }
25 } catch (Exception e) {
26 e.printStackTrace();
27 } finally {
28 fis.close();
29 fos.close();
30 }
31 i++;
32 }
33 return SUCCESS;
34 }