jsp\struts1.2\struts2 中文件上传
a.在jsp中简单利用Commons-fileupload组件实现
b.在struts1.2中实现
c.在sturts2中实现
现在把Code与大家分享一下..
注:此为三个简单Demo,仅供练习用,并没有做太多上传限制
如有兴趣可以自行查看相关文档说明
一.在JSP环境中利用Commons-fileupload组件实现文件上传
1.页面upload.jsp清单如下:
<%@ page language= "java"
import = "java.util.*"
pageEncoding= "UTF-8" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
<html> <head>
<title>The FileUpload Demo</title>
</head>
<body>
<form action= "UploadFile"
method= "post"
enctype= "multipart/form-data" >
<p><input type= "text"
name= "fileinfo"
value= "" >文件介绍</p>
<p><input type= "file"
name= "myfile"
value= "浏览文件" ></p>
<p><input type= "submit"
value= "上 传" ></p>
</form>
</body>
</html> |
注意:在上传表单中,既有普通文本域也有文件上传域
2.FileUplaodServlet.java清单如下:
package
org.chris.fileupload;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import
org.apache.commons.fileupload.FileItem;
import
org.apache.commons.fileupload.FileItemFactory;
import
org.apache.commons.fileupload.disk.DiskFileItemFactory;
import
org.apache.commons.fileupload.servlet.ServletFileUpload;
public
class FileUplaodServlet extends
HttpServlet {
protected
void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
doPost(request, response);
}
protected
void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
request.setCharacterEncoding( "UTF-8" );
//文件的上传部分
boolean
isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart)
{
try
{
FileItemFactory factory = new
DiskFileItemFactory();
ServletFileUpload fileload = new
ServletFileUpload(factory);
// 设置最大文件尺寸,这里是4MB fileload.setSizeMax( 4194304 );
List<FileItem> files = fileload.parseRequest(request);
Iterator<FileItem> iterator = files.iterator();
while (iterator.hasNext())
{
FileItem item = iterator.next();
if (item.isFormField())
{
String name = item.getFieldName();
String value = item.getString();
System.out.println( "表单域名为: "
+ name + "值为: "
+ value);
} else {
//获得获得文件名,此文件名包括路径
String filename = item.getName();
if (filename != null )
{
File file = new
File(filename);
//如果此文件存在
if (file.exists()){
File filetoserver = new
File( "d:\\upload\\" ,file.getName());
item.write(filetoserver);
System.out.println( "文件 "
+ filetoserver.getName() + " 上传成功!!" );
}
}
}
}
} catch
(Exception e) {
System.out.println(e.getStackTrace());
}
}
}
} |
3.web.xml清单如下:
Java代码 <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>UploadFileServlet</servlet-name> <servlet-class> org.chris.fileupload.FileUplaodServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadFileServlet</servlet-name> <url-pattern>/UploadFile</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>/Index.jsp</welcome-file> </welcome-file-list> </web-app>
二.在strut1.2中实现
1.上传页面file.jsp 清单如下:
Java代码 <%@ page language="java" pageEncoding="ISO-8859-1"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%> <html> <head> <title>JSP for FileForm form</title> </head> <body> <html:form action="/file" enctype="multipart/form-data"> <html:file property="file1"></html:file> <html:submit/><html:cancel/> </html:form> </body> </html>
2.FileAtion.java的清单如下:
Java代码 /* * Generated by MyEclipse Struts * Template path: templates/java/JavaClass.vtl */ package action; import java.io.*; 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 org.apache.struts.upload.FormFile; import form.FileForm; /** * @author Chris * Creation date: 6-27-2008 * * XDoclet definition: * @struts.action path="/file" name="fileForm" input="/file.jsp" */ public class FileAction extends Action { /* * Generated Methods */ /** * Method execute * @param mapping * @param form * @param request * @param response * @return ActionForward */ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { FileForm fileForm = (FileForm) form; FormFile file1=fileForm.getFile1(); if(file1!=null){ //上传路径 String dir=request.getSession(true).getServletContext().getRealPath("/upload"); OutputStream fos=null; try { fos=new FileOutputStream(dir+"/"+file1.getFileName()); fos.write(file1.getFileData(),0,file1.getFileSize()); fos.flush(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try{ fos.close(); }catch(Exception e){} } } //页面跳转 return mapping.findForward("success"); } }
3.FileForm.java的清单如下:
package form; import javax.servlet.http.HttpServletRequest; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; import org.apache.struts.upload.FormFile; /** * @author Chris * Creation date: 6-27-2008 * * XDoclet definition: * @struts.form name="fileForm" */ public class FileForm extends ActionForm { /* * Generated Methods */ private FormFile file1; /** * Method validate * @param mapping * @param request * @return ActionErrors */ public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { // TODO Auto-generated method stub return null; } /** * Method reset * @param mapping * @param request */ public void reset(ActionMapping mapping, HttpServletRequest request) { // TODO Auto-generated method stub } public FormFile getFile1() { return file1; } public void setFile1(FormFile file1) { this.file1 = file1; } }
4.struts-config.xml的清单如下:
Java代码 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <data-sources /> <form-beans > <form-bean name="fileForm" type="form.FileForm" /> </form-beans> <global-exceptions /> <global-forwards /> <action-mappings > <action attribute="fileForm" input="/file.jsp" name="fileForm" path="/file" type="action.FileAction" validate="false"> <forward name="success" path="/file.jsp"></forward> </action> </action-mappings> <message-resources parameter="ApplicationResources" /> </struts-config>
5.web.xml代码清单如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>3</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>3</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
三.在struts2中实现(以图片上传为例)
1.FileUpload.jsp代码清单如下:
Java代码 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>The FileUplaodDemo In Struts2</title> </head> <body> <s:form action="fileUpload.action" method="POST" enctype="multipart/form-data"> <s:file name="myFile" label="MyFile" ></s:file> <s:textfield name="caption" label="Caption"></s:textfield> <s:submit label="提交"></s:submit> </s:form> </body> </html>
2.ShowUpload.jsp的功能清单如下:
Java代码 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>ShowUpload</title> </head> <body> <div style ="padding: 3px; border: solid 1px #cccccc; text-align: center" > <img src =‘UploadImages/<s:property value ="imageFileName"/> ‘/> <br /> <s:property value ="caption"/> </div > </body> </html>
3.FileUploadAction.java的代码清单如下 :
Java代码 package com.chris; import java.io.*; import java.util.Date; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class FileUploadAction extends ActionSupport{ private static final long serialVersionUID = 572146812454l ; private static final int BUFFER_SIZE = 16 * 1024 ; //注意,文件上传时<s:file/>同时与myFile,myFileContentType,myFileFileName绑定 //所以同时要提供myFileContentType,myFileFileName的set方法 private File myFile; //上传文件 private String contentType;//上传文件类型 private String fileName; //上传文件名 private String imageFileName; private String caption;//文件说明,与页面属性绑定 public void setMyFileContentType(String contentType) { System.out.println("contentType : " + contentType); this .contentType = contentType; } public void setMyFileFileName(String fileName) { System.out.println("FileName : " + fileName); this .fileName = fileName; } public void setMyFile(File myFile) { this .myFile = myFile; } public String getImageFileName() { return imageFileName; } public String getCaption() { return caption; } public void setCaption(String caption) { this .caption = caption; } private static void copy(File src, File dst) { try { InputStream in = null ; OutputStream out = null ; try { in = new BufferedInputStream( new FileInputStream(src), BUFFER_SIZE); out = new BufferedOutputStream( new FileOutputStream(dst), BUFFER_SIZE); byte [] buffer = new byte [BUFFER_SIZE]; while (in.read(buffer) > 0 ) { out.write(buffer); } } finally { if ( null != in) { in.close(); } if ( null != out) { out.close(); } } } catch (Exception e) { e.printStackTrace(); } } private static String getExtention(String fileName) { int pos = fileName.lastIndexOf("."); return fileName.substring(pos); } @Override public String execute() { imageFileName = new Date().getTime() + getExtention(fileName); File imageFile = new File(ServletActionContext.getServletContext().getRealPath("/UploadImages" ) + "/" + imageFileName); copy(myFile, imageFile); return SUCCESS; } }
注:此时仅为方便实现Action所以继承ActionSupport,并Overrider
execute()方法
在struts2中任何一个POJO都可以作为Action
4.struts.xml清单如下:
Java代码 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="example" namespace="/" extends="struts-default"> <action name="fileUpload" class="com.chris.FileUploadAction"> <interceptor-ref name="fileUploadStack"/> <result>/ShowUpload.jsp</result> </action> </package> </struts>
5.web.xml清单如下:
Java代码 <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <filter > <filter-name > struts-cleanup </filter-name > <filter-class > org.apache.struts2.dispatcher.ActionContextCleanUp </filter-class > </filter > <filter-mapping > <filter-name > struts-cleanup </filter-name > <url-pattern > /* </url-pattern > </filter-mapping > <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>Index.jsp</welcome-file> </welcome-file-list> </web-app>