一.Struts文件上传的思路
之前也讲过了FileUpload这个组件,功能很强大,但是操作繁琐复杂。这次,在Strust中也对文件上传有所支持,并FileUpload进行了包装,用起来方便了许多。
这里涉及到了一个标签和一个类:
<html:file property="对应ActionForm中的属性名称">
用这个标签可以上传文件,但是要接收次内容必须依靠org.apache.struts.upload.FormFile
接口完成。
二.实现
sh.jsp:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> < html > < head > < title >sh.jsp</ title > < meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" > </ head > < body > < html:form action = "/jsp/upload.do" method = "post" enctype = "multipart/form-data" > < html:file property = "photo" ></ html:file > < html:submit value = "上传" ></ html:submit > </ html:form > </ body > </ html > |
UploadForm.java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package com.zyy.struts.form; import org.apache.struts.action.ActionForm; import org.apache.struts.upload.FormFile; public class UploadForm extends ActionForm { private FormFile photo; public FormFile getPhoto() { return photo; } public void setPhoto(FormFile photo) { this .photo = photo; } } |
IPTimeStamp.java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
package com.zyy.util; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; public class IPTimeStamp { private SimpleDateFormat sdf = null ; private String ip = null ; public IPTimeStamp() { } public IPTimeStamp(String ip) { this .ip = ip; } public String getIPTimeRand() { StringBuffer buf = new StringBuffer(); if ( this .ip != null ) { String s[] = this .ip.split( "\\." ); for ( int i = 0 ; i < s.length; i++) { buf.append( this .addZero(s[i], 3 )); } } buf.append( this .getTimeStamp()); Random r = new Random(); for ( int i = 0 ; i < 3 ; i++) { buf.append(r.nextInt( 10 )); } return buf.toString(); } public String getDate() { this .sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss.SSS" ); return this .sdf.format( new Date()); } public String getTimeStamp() { this .sdf = new SimpleDateFormat( "yyyyMMddHHmmssSSS" ); return this .sdf.format( new Date()); } private String addZero(String str, int len) { StringBuffer s = new StringBuffer(); s.append(str); while (s.length() < len) { s.insert( 0 , "0" ); } return s.toString(); } public static void main(String args[]) { System.out.println( new IPTimeStamp( "192.168.1.1" ).getIPTimeRand()); } } |
UploadAction.java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
package com.zyy.struts.action; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import com.zyy.struts.form.UploadForm; import com.zyy.util.IPTimeStamp; public class UploadAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { UploadForm uploadForm = (UploadForm) form; IPTimeStamp ips = new IPTimeStamp(request.getRemoteAddr()); // 文件名 String fileName = ips.getIPTimeRand() + "." + uploadForm.getPhoto().getFileName().split( "\\." )[uploadForm .getPhoto().getFileName().split( "\\." ).length - 1 ]; // 输出路径 File outFile = new File( super .getServlet().getServletContext() .getRealPath( "/" ) + "upload" + File.separator + fileName); // 存放图片的文件夹 File file = new File( super .getServlet().getServletContext() .getRealPath( "/" ) + "upload" ); if (!file.exists()) { file.mkdir(); } InputStream input = uploadForm.getPhoto().getInputStream(); OutputStream output = new FileOutputStream(outFile); byte data[] = new byte [ 1024 ]; int temp = 0 ; while ((temp = input.read(data, 0 , 1024 )) != - 1 ) { output.write(data); } output.close(); input.close(); return null ; } } |
struts-config.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<? xml version = "1.0" encoding = "ISO-8859-1" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"> < struts-config > < form-beans > < form-bean name = "uploadForm" type = "com.zyy.struts.form.UploadForm" ></ form-bean > </ form-beans > < global-exceptions > </ global-exceptions > < global-forwards > </ global-forwards > < action-mappings > < action path = "/jsp/upload" attribute = "uploadForm" input = "/jsp/sh.jsp" name = "uploadForm" scope = "request" type = "com.zyy.struts.action.UploadAction" > </ action > </ action-mappings > < message-resources parameter = "resource.MessageResources" /> </ struts-config > |
由于我保存在的是super.getServlet().getServletContext().getRealPath("/")+ "upload"
这是虚拟目录的真实路径的upload文件夹下。
由此可见,在Struts中的文件上传原理和FileUpload一样,但是Struts进行了包装,所以用起来明显比单独用FileUpload组件方便了许多。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。