一、servlet基本方式(servlet3.0以上)
下面是工程的大致目录结构
upload.jsp
<%-- start --%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="test.do" enctype="multipart/form-data" method="post">
<input type="file" name="file"> <br>
<input type="submit" name="提交">
</form>
</body>
</html>
<%-- end --%>
Download.java
package com.upload; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebInitParam; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; //location表示文件缓存的位置 @MultipartConfig(location="D:/temp") //定义servlet访问方式,对应web.xml @WebServlet(loadOnStartup = 1, initParams = { @WebInitParam(name = "test", value = "test") }, urlPatterns = "/test.do") public class Upload extends HttpServlet { private static final long serialVersionUID = 1L; private String test = ""; @Override public void init(ServletConfig config) throws ServletException { test = config.getInitParameter("test"); System.out.println(test); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Part part = req.getPart("file"); String info = part.getHeader("Content-Disposition"); String fileName = info.substring(info.indexOf("filename="") + 10, info.lastIndexOf(""")); //System.out.println(fileName); //part.write(fileName); resp.setContentType("application/x-msdownload"); resp.addHeader("Content-Disposition", "attachment; filename="" + fileName + """); InputStream inputStream = part.getInputStream(); byte[] buff = new byte[1024]; OutputStream outputStream = resp.getOutputStream(); while((inputStream.read(buff)) != -1) { outputStream.write(buff); } } }
Upload.java
package com.upload; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebInitParam; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; //loaction定义要保存文件的路径 @MultipartConfig(location="D:/temp") @WebServlet(loadOnStartup = 1, initParams = { @WebInitParam(name = "test", value = "test") }, urlPatterns = "/download.do") public class Download extends HttpServlet { private static final long serialVersionUID = 1L; private String test = ""; @Override public void init(ServletConfig config) throws ServletException { test = config.getInitParameter("test"); System.out.println(test); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Part part = req.getPart("file"); String info = part.getHeader("Content-Disposition"); String fileName = info.substring(info.indexOf("filename="") + 10, info.lastIndexOf(""")); System.out.println(fileName); part.write(fileName); } }
由于使用的是注释的方式注册servlet,所以web.xml没有注册信息
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>uploadAndDownload</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
启动tomcat,输入网址localhost:8080/uploadAndDownload/upload.jsp进行测试。
二、smartupload
需要下载smartupload的jar包
jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="SUpload" method="post" enctype="multipart/form-data">
<input type="file" name="file1"><br>
<input type="file" name="file2"><br>
<input type="file" name="file3"><br>
<input type="submit" value="submit">
</form>
</body>
</html>
SUpload.java
package youth.hong; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.jspsmart.upload.Files; import com.jspsmart.upload.SmartUpload; @SuppressWarnings("serial") public class SUpload extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { SmartUpload smartUpload = new SmartUpload(); smartUpload.initialize(this.getServletConfig() , req, resp); String filePath = "D:/temp"; smartUpload.setMaxFileSize(1024*1024*10); smartUpload.setTotalMaxFileSize(1024*1024*30); smartUpload.setAllowedFilesList("txt,jpg,jpeg,gif"); try { //smartUpload.setDeniedFilesList("exe"); //准备上传 smartUpload.upload(); //上传并返回上传成功的个数 smartUpload.save(filePath); } catch (Exception e) { e.printStackTrace(); } Files files = smartUpload.getFiles(); for(int i = 0; i < files.getCount(); i++) { System.out.println("-------------------------"); System.out.println("表单中的字段名:" + files.getFile(i).getFieldName()); System.out.println("文件名:" + files.getFile(i).getFileName()); System.out.println("文件路径名:" + files.getFile(i).getFilePathName()); System.out.println("文件的大小:" + files.getFile(i).getSize()); System.out.println("-------------------------"); } } }
下载
Download.java
package youth.hong; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings("serial") public class Download extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String fileName = req.getParameter("fileName"); String path = "D:/" + fileName; File file = new File(path); InputStream inputStream = new FileInputStream(file); byte[] buff = new byte[inputStream.available()]; OutputStream outputStream = resp.getOutputStream(); resp.setContentType("application/x-msdownload"); resp.addHeader("Content-Disposition", "attachment; filename="" + fileName + """); inputStream.read(buff); outputStream.write(buff); inputStream.close(); outputStream.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
批量下载
BatchDownload.java
package youth.hong; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings("serial") public class BatchDownload extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String[] fileNames = req.getParameterValues("fileName"); String filePath = "D:/temp/"; resp.setContentType("application/x-msdownload"); resp.addHeader("Content-Disposition", "attachment; filename="hello.zip""); ZipOutputStream zip = new ZipOutputStream(resp.getOutputStream()); for (String fileName : fileNames) { File file = new File(filePath + fileName); //用于区分单个文件 ZipEntry zipEntry = new ZipEntry(fileName); zip.putNextEntry(zipEntry); FileInputStream read = new FileInputStream(file); byte[] buff = new byte[1024]; while((read.read(buff)) != -1) { zip.write(buff); } zip.flush(); zip.setComment("下载的项目:" + fileName +" " ); read.close(); } zip.closeEntry(); zip.close(); } }
web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>scxz</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>upload</servlet-name> <servlet-class>youth.hong.Upload</servlet-class> </servlet> <servlet-mapping> <servlet-name>upload</servlet-name> <url-pattern>/upload</url-pattern> </servlet-mapping> <servlet> <servlet-name>download</servlet-name> <servlet-class>youth.hong.Download</servlet-class> </servlet> <servlet-mapping> <servlet-name>download</servlet-name> <url-pattern>/download</url-pattern> </servlet-mapping> <servlet> <servlet-name>SUpload</servlet-name> <servlet-class>youth.hong.SUpload</servlet-class> </servlet> <servlet-mapping> <servlet-name>SUpload</servlet-name> <url-pattern>/SUpload</url-pattern> </servlet-mapping> <servlet> <servlet-name>BatchDownload</servlet-name> <servlet-class>youth.hong.BatchDownload</servlet-class> </servlet> <servlet-mapping> <servlet-name>BatchDownload</servlet-name> <url-pattern>/BatchDownload</url-pattern> </servlet-mapping> </web-app>
使用富文本上传文件
到http://kindeditor.codeplex.com/下载
jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>MultiImageDialog Examples</title> <link rel="stylesheet" href="css/themes/default/default.css" /> <script src="js/kindeditor.js"></script> <script src="js/lang/zh_CN.js"></script> <script> var editor; KindEditor.ready(function(K) { editor = K.create('textarea[name="content"]', { allowFileManager : true,
//设置上传文件的路径 uploadJson : '/KindEditorSCXZ/uploadImg' }); }); </script> </head> <body> <textarea name="content" style="800px;height:400px;visibility:hidden;">KindEditor</textarea> </body> </html>
upload.java
package com.upload; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; @MultipartConfig(location = "D:\newworkspace20160818\KindEditorSCXZ\WebContent\images") @WebServlet(urlPatterns = "/uploadImg") public class Upload extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // Collection<Part> parts = req.getParts(); /** * 由于富文本是使用多次请求进行上传操作的,所以不存在一次请求有多个文件同时上传的问题 */ String filename = ""; //富文本上传时的文件域名 Part part = req.getPart("imgFile"); String info = part.getHeader("Content-Disposition"); System.out.println(info); filename = info.substring(info.indexOf("filename="") + 10, info.lastIndexOf(""")); /*for (Part part : parts) { String info = part.getHeader("Content-Disposition"); filename = info.substring(info.indexOf("filename="" + 10), info.lastIndexOf(""")); part.write(filename); }*/ part.write(filename); resp.setContentType("application/json;charset=utf-8"); PrintWriter pw = resp.getWriter(); pw.write("{"error":0, "url":"/KindEditorSCXZ/images/" + filename + ""}"); } }
使用springMVC上传下载
UploadDownload.java
package youth.hong.annotation; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Date; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.multipart.commons.CommonsMultipartResolver; import org.springframework.web.servlet.mvc.multiaction.MultiActionController; @Controller @RequestMapping("/upload") public class UploadDownloadController extends MultiActionController { @RequestMapping("/file") public String uploadFile(@RequestParam("file") MultipartFile file, HttpServletRequest request, HttpServletResponse response){ InputStream in = null; OutputStream out = null; System.out.println("文件名:" + file.getOriginalFilename() + "---------" + file.getContentType() + "----------" + file.getSize()); long start = System.currentTimeMillis(); if(!file.isEmpty()) { try { in = file.getInputStream(); out = new FileOutputStream("D:/" + new Date().getTime() + file.getOriginalFilename()); byte[] buff = new byte[1024]; while((in.read(buff)) != -1) { out.write(buff); out.flush(); } } catch (IOException e) { e.printStackTrace(); } finally { try { if(in != null) { in.close(); } if(out != null) { out.close(); } } catch (IOException e) { e.printStackTrace(); } } } long end = System.currentTimeMillis(); System.out.println("传统java上传用时:" + (end - start)); return "/fileupload"; } @RequestMapping("/file2") public String uploadFile2(HttpServletRequest request, HttpServletResponse response){ //拿到文件上传解析器 CommonsMultipartResolver resolver = new CommonsMultipartResolver(request.getServletContext()); //传统的java解析request是否为上传文件,这个与xml配置的解析器是一样的。 if(resolver.isMultipart(request)) { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request; //键值对的形式 Map<String, MultipartFile> map = multipartRequest.getFileMap(); Set<Map.Entry<String, MultipartFile>> set = map.entrySet(); for (Entry<String, MultipartFile> entry : set) { MultipartFile file = entry.getValue(); String fileName = "demo" + UUID.randomUUID() + "." + file.getOriginalFilename().split("\.")[1]; File f = new File("D:/" + fileName); try { long start = System.currentTimeMillis(); //将文件输出 file.transferTo(f); long end = System.currentTimeMillis(); System.out.println("springMVC 上传用时:" + (end - start)); } catch (IllegalStateException | IOException e) { e.printStackTrace(); } System.out.println("ok!!"); } } return "/fileupload"; } @RequestMapping("/file3") public String uploadFile3(MultipartFile[] multipartFile) throws Exception { for (MultipartFile file : multipartFile) { //检查是否有文件输入框没有输入文件 if(!file.isEmpty()) { file.transferTo(new File("D:/temp/", file.getOriginalFilename())); } } return "/fileupload"; } @RequestMapping("/download") public void download(@RequestParam("fileName") String fileName, HttpServletRequest request, HttpServletResponse response) throws Exception { //得到当前上传缓存文件的位置 String path = Thread.currentThread().getContextClassLoader().getResource("").getPath(); System.out.println(path); response.setCharacterEncoding("utf-8"); response.setContentType("multipart/form-data"); File file = new File(path + "/" + fileName); InputStream in = new FileInputStream(file); OutputStream out = response.getOutputStream(); byte[] buff = new byte[1024]; int length = 0; while((length = in.read(buff)) != -1) { out.write(buff); } } }
upload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="upload/file" method="post" enctype="multipart/form-data"> file: <input type="file" name="file"><br> <input type="submit" value="submit"> </form> <form action="upload/file2" method="post" enctype="multipart/form-data"> file: <input type="file" name="file"><br> <input type="submit" value="submit"> </form> <form action="upload/file3" method="post" enctype="multipart/form-data"> file: <input type="file" name="file"><br> file: <input type="file" name="file"><br> <input type="submit" value="submit"> </form> </body> </html>
download.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="upload/download?fileName=C语言游戏.doc">下载</a>
</body>
</html>
spring.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <context:component-scan base-package="youth.hong.annotation"></context:component-scan>
<!-- 推荐使用这个标签定义注解的方式 -->
<!-- <mvc:annotation-driven></mvc:annotation-driven> -->
<!-- 使用bean注入的方式配置注解解析,现在不推荐了,仅作了解使用 --> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<!-- 古老的xml配置方式,使用这些bean定义你访问的url是想要调用哪个方法,仅作了解,现在没人还用这个 --> <!-- <bean name="/youth/hong" class="youth.hong.HelloWorld"></bean> <bean name="/multiple" class="youth.hong.MultiController"> <property name="methodNameResolver"> <ref bean="paraMethodResolver"/> </property> </bean> <bean name="/img" class="youth.hong.StaticController"> <property name="methodNameResolver"> <ref bean="paraMethodResolver"/> </property> </bean> <bean id="paraMethodResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"> <property name="paramName"> 传参时的参数名http://localhost:8888/springMVC_003_multiple/multiple?action=update <value>action</value> </property> <property name="defaultMethodName"> <value>img</value> </property> </bean> --> <!-- 告知静态文件不要拦截,直接访问 --> <mvc:resources location="/image/" mapping="/dog/image/**"></mvc:resources> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean> <!-- SpringMVC在超出上传文件限制时,会抛出org.springframework.web.multipart.MaxUploadSizeExceededException --> <!-- 该异常是SpringMVC在检查上传的文件信息时抛出来的,而且此时还没有进入到Controller方法中 --> <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <!-- 遇到MaxUploadSizeExceededException异常时,自动跳转到/WEB-INF/jsp/error_fileupload.jsp页面 --> <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">error_fileupload</prop> </props> </property> </bean> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="UTF-8" /> </beans>
struts2框架上传下载
Action.java
package youth.hong; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.UUID; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class Action extends ActionSupport{ private String title; private File[] upload;//private List<File> upload private String[] uploadContentType;//private List<String> private String[] uploadFileName; private String savePath; private String allowTypes; public String getAllowTypes() { return allowTypes; } public void setAllowTypes(String allowTypes) { this.allowTypes = allowTypes; } public File[] getUpload() { return upload; } public void setUpload(File[] upload) { this.upload = upload; } public String[] getUploadContentType() { return uploadContentType; } public void setUploadContentType(String[] uploadContentType) { this.uploadContentType = uploadContentType; } public String[] getUploadFileName() { return uploadFileName; } public void setUploadFileName(String[] uploadFileName) { this.uploadFileName = uploadFileName; } public String getSavePath() { return savePath; } public void setSavePath(String savePath) { this.savePath = savePath; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @Override public String execute() throws Exception { String[] types = this.getTypes(); String check = this.fileFilter(types); System.out.println(check); if(check == null) { return INPUT; } String newName = null; FileInputStream fis = null; FileOutputStream fos = null; for(int i = 0; i < upload.length; i++) { newName = UUID.randomUUID() + uploadFileName[i].substring(uploadFileName[i].lastIndexOf('.')); uploadFileName[i] = newName; String path = ServletActionContext.getServletContext().getRealPath(savePath); System.out.println(path + "\" + newName); System.out.println(upload[i].getName()); fis = new FileInputStream(upload[i]); fos = new FileOutputStream(path + "\" + newName); byte[] buff = new byte[1024]; int len = 0; while((len=fis.read(buff)) > 0) { fos.write(buff, 0, len); } } this.setUploadFileName(uploadFileName); fis.close(); fos.close(); return SUCCESS; } /** * 还可以使用struts2自带的fileUpload拦截器来过滤 * @param types * @return */ public String fileFilter(String[] types) { boolean check; for(int i = 0; i < upload.length; i++) { check = false; for(String string : types) { if(uploadContentType[i].equals(string)) { check = true; } } if(!check) { return null; } } return "continue"; } public String[] getTypes() { String[] types = allowTypes.split(","); return types; } }
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 动态地调用方法打开 --> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <constant name="struts.devMode" value="true" /> <constant name="struts.i18n.encoding" value="utf-8"></constant> <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> <constant name="struts.custom.i18n.resources" value="global"></constant> <package name="youth" namespace="/" extends="struts-default"> <action name="test" class="youth.hong.Action"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="fileUpload">
<!-- 使用拦截器进行文件上传操作的限制 --> <param name="allowedTypes">image/jpeg,image/jpg,image/bmp,image/png</param> <param name="maxSize">200000000000000</param><!-- 单位字节 --> </interceptor-ref> <param name="savePath">/upload</param>
<!-- 手工进行文件上传的限制 --> <param name="allowTypes">image/jpeg,image/jpg,image/bmp,image/png</param> <result name="success">/success.jsp</result> <result name="input">/test.jsp</result> </action> </package> <!-- Add packages here --> </struts>
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>Struts2_001</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
upload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <%=application.getRealPath("/upload") %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /* function checkusername() { var username = document.getElementById("username"); var request = new XMLHttpRequest(); url = "path/index"; request.open("POST", url, true); request.send(username.value); } */ </script> </head> <body> <s:fielderror></s:fielderror> <s:head/> <form method="post" action="test" enctype="multipart/form-data"> <input type="file" name="upload" /><br> <br> <input type="file" name="upload" /><br> <br> <input type="file" name="upload" /><br> <br> <input type="text" name="title" /><br> <br> <input type="submit" value="submit" /> </form> </body> </html>
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<img src="/upload/<s:property value='uploadFileName' />"/>
</body>
</html>
Download
package youth.hong; import java.io.InputStream; import java.io.UnsupportedEncodingException; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class Action extends ActionSupport{ private String inputName; private String contentType; private String fileName; public String getInputName() { return inputName; } public void setInputName(String inputName) { this.getInputStream(); System.out.println(inputName); try { inputName = new String(inputName.getBytes("ISO-8859-1"),"utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } this.inputName = inputName; } public String getContentType() { return contentType; } public void setContentType(String contentType) { try { contentType = new String(contentType.getBytes("ISO-8859-1"),"utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } this.contentType = contentType; } public String getFileName() { return fileName; } public void setFileName(String fileName) { try { fileName = new String(fileName.getBytes("ISO-8859-1"),"utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } this.fileName = fileName; } public InputStream getInputStream() { InputStream is = ServletActionContext.getServletContext().getResourceAsStream("/upload/warArea.jsp"); System.out.println(is); return is; } }
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 动态地调用方法打开 --> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <constant name="struts.devMode" value="true" /> <constant name="struts.i18n.encoding" value="utf-8"></constant> <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> <constant name="struts.custom.i18n.resources" value="global"></constant> <package name="youth" namespace="/" extends="struts-default"> <action name="download" class="youth.hong.Action"> <result name="success" type="stream"> <param name="contentType">${contentType}</param> <param name="inputName">${getInputStream}</param> <param name="contentDisposition">filename="${fileName}"</param> <param name="bufferSize">800000000000000</param> </result> </action> </package> <!-- Add packages here --> </struts>
jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /* function checkusername() { var username = document.getElementById("username"); var request = new XMLHttpRequest(); url = "path/index"; request.open("POST", url, true); request.send(username.value); } */ </script> </head> <body> <a href="download?inputName=/upload/warArea.jpg&contentType=image/jpg&fileName=warArea.jpg">download</a> </body> </html>