Struts2文件上传默认采用apache的文件上传的包,新建处理上传的Servlet 如下:
在WebRoot下面新建文件夹:upload,项目发布到服务器中去时服务器中就一个upload的文件夹
web.xml中Servlet配置如下:
<servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>com.mengya.servlet.UploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/UploadServlet</url-pattern> </servlet-mapping>
新建JSP如下:
<form action="UploadServlet" method="post" enctype="multipart/form-data"> username:<input type="text" name="username"><br> password:<input type="password" name="password"><br> file1:<input type="file" name="file1"><br> file2:<input type="file" name="file2"><br> <input type="submit" value="上传"> </form>
/** * * @author 张明学 * * 使用apache的commons-io-1.3.2.jar,commons-fileupload-1.2.1.jar完成处理文件上传的Servlet */ public class UploadServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * request.getRealPath("/")返回的是当前项目所在硬盘的路径 如:C:\Program Files\Apache * Software Foundation\Tomcat 6.0\webapps\Struts2_9\ * request.getRealPath("/upload")返回的是当前项目所在硬盘的路径+根目录下面的upload的路径 * 如:C:\Program Files\Apache Software Foundation\Tomcat * 6.0\webapps\Struts2_9\Upload */ String path = request.getRealPath("/upload"); DiskFileItemFactory factory = new DiskFileItemFactory(); /** * Apache上传组件上传的文件若小于某一值时就将要上面的文件放在内存中,否则就放到一个临时的目录中去。 */ /** * 设置文件小于多少时放到内存当中去。1024*1024为1M的大小 */ factory.setSizeThreshold(1024 * 1024); /** * 设置大于上面设置的大小的文件上传时所放的临时目录,上传完成后临时目录所存放的垃圾文件不自动删除。 */ factory.setRepository(new File(path)); /** * ServletFileUpload完成上传的核内类 */ ServletFileUpload servletUpload = new ServletFileUpload(factory); try { List<FileItem> list = servletUpload.parseRequest(request); for (FileItem item : list) { /** * 非file字段,即普通的字段 */ if (item.isFormField()) { /** * 获得字段的名称,即对应页面文本框等的名称 */ String name = item.getFieldName(); /** * 以gbk方式获得该字段的value值,即对应页面文本框等所输入的值 */ String value = item.getString("gbk"); request.setAttribute(name, value); } else { /** * file型字段 */ /** * 获得页面file的名称 */ String name = item.getFieldName(); /** * 获得页面file中用户选择的文件的路径(与普通的字段不同) * 由于不同的浏览器所取得值不同,有的得到是所选择文件的路径,有的得到的就是所选择的文件的名称。 * 如:有的浏览器所取得的是:C:\Documents and * Settings\Administrator\桌面\电话本.txt 有的浏览器所取得的是:电话本.txt */ String value = item.getName(); /** * 下面做一个统一的处理 若为文件名则下面没有”\“则start为-1 */ int start = value.lastIndexOf("\\"); String fileName = value.substring(start + 1); request.setAttribute(name, fileName); /** * 下面做上传的处理 */ InputStream is = item.getInputStream(); /** * 上传的路径依然选择path */ File UploadFile = new File(path, fileName); OutputStream os = new FileOutputStream(UploadFile); byte[] buffer = new byte[400]; int length = 0; while ((length = is.read(buffer)) > 0) { os.write(buffer, 0, buffer.length); } os.close(); is.close(); /** * 更简单的上传方式 * 无需使用InputStream和OutputStream对象item.write(File)即可 * item.write(UploadFile); */ } } } catch (FileUploadException e) { e.printStackTrace(); } } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
相关资源:通过Servlet文件上传理解Struts2文件上传原理(附源码)