java中Commons-fileupload组件实现上传
在实现功能之前需要导入两个jar文件,分别是 commons-fileupload-1.3.1.jar 和 commons-io.jar 文件,这里就不提供链接,网上搜索都有可以自行下载。
----------------------------------------------------jsp页面-----------------------------------------------------
第一步:先上传一个简单的jsp页面 ,在上jsp页面之前需要说的问题是:需要在jsp页面导入类库:<%@ page import="org.apache.commons.fileupload.*"%>
接下来来一个简单的form表单的jsp页面的代码,用于界面上传:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page import="org.apache.commons.fileupload.*"%><!-- 导入类库 --> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>文件上传</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <h2> 使用commons-fileupload上传文件 </h2> <hr /> <form action="CommonsFileuploadServlet02" method="post" enctype="multipart/form-data"> <table> <tr> <td>上传的用户</td> <td><input type="text" name="uesr" size="20" /></td> </tr> <tr> <td>请选择要上传的文件</td> <td><input type="file" name="filepath" size="20" /></td> </tr> <tr> <td><input type="submit" value="上传" /> </td> </tr> </table> </form> </body> </html>
-----------------------------------------------CommonsFileuploadServlet.java逻辑处理文件------------------------------------------
第二部份内容是form表单请求的Servlet文件:CommonsFileuploadServlet.java
注意看doPost内部的方法:
package cn.jbit.servlet; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.DiskFileUpload; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class CommonsFileuploadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8");// 输入防止中文乱码 response.setContentType("text/html;charset=UTF-8");// 输出防止中文乱码 PrintWriter out = response.getWriter(); String show = "文件上传成功"; // 上传的文件名 String uploadfileName = ""; // 表单元素的name属性值 String filename = ""; // 1.请求信息是否为multipart/form-data类型 boolean isMultipart = ServletFileUpload.isMultipartContent(request); // 2.设置上传文件的存储路径,注意这里获取的是tomcat服务下当前项目下的目录文件 /* * String uploadFilePath = request.getSession().getServletContext() * .getRealPath(""); */ /** * 这里我们可以根据自己的需求自定义路径 */ String uploadFilePath = "D:/"; // 判断如果是multipart/form-data类型 if (isMultipart) { // 创建file工厂 FileItemFactory factory = new DiskFileItemFactory(); // ServletFileUpload对象的创建需要依赖FileItemFactory工厂 ServletFileUpload upload = new ServletFileUpload(factory); /** * 当然,这里我们也可以这么写 ServletFileUpload upload = new * ServletFileUpload(new DiskFileItemFactory()); * //简化了创建FileItemFactory工厂实例 */ // 设置转换时使用的字符编码集 upload.setHeaderEncoding("UTF-8"); /** * 在这里建议: request.setCharacterEncoding("UTF-8");// 输入防止中文乱码 * response.setContentType("text/html;charset=UTF-8");//输出防止中文乱码 * upload.setHeaderEncoding("UTF-8"); 这三句防止乱码的操作都加上!保险!! * */ try { // 这里创建FileItem集合对象,用户接收ServletFileUpload // 对象的parseRequest()方法所返回的值 List<FileItem> fileList = upload.parseRequest(request); Iterator<FileItem> iterator = fileList.iterator(); while (iterator.hasNext()) { // 依次处理每个文件 // 循环获取FileItem对象实例 FileItem item = iterator.next(); /* * isFormField()方法的意思是根据表单内的字段类型返回不同的结果,如果得到的是普通字段的类型则返回true, * 如果是文件字段则返回false */ if (item.isFormField()) { // 这里获取的是提交的form表单内的普通字段、如text、password等 filename = item.getFieldName(); // 表单字段的name属性值 // ,注意是name属性的值,而不是对应value的值,这一点需要明白 System.out.println("---------------" + filename); // 打印 } else {// 否则获取文件字段 String filedname = item.getName(); // 获取上传文件的全路径字符串 System.out.println("--------------" + filedname); // 打印测试 // 判断是否不等于空 if (filedname != null && !filedname.equals("")) { // 创建file对象,保存输入的文件路径(需要上传的文件是从哪个路径下传过来的) File fullFile = new File(filedname); System.out.println("-----------fullFile----------" + fullFile); // 打印测试,看看此时的fullFile是什么 // 这里通过File对象的getName()方法从路径中获取上传的文件名称,然后把文件名和新的路径(需要将上传文件传到哪里的路径)进行拼接,结合,从而形成一个新的路径 File savefile = new File(uploadFilePath, fullFile .getName()); System.out.println("-----------savefile----------" + savefile); // 打印测试将要讲文件传入哪里的全路径 // 通过FileItem对象的write()方法保存的主体内容到指定的文件路径中 item.write(savefile); // 获取上传的文件名称 uploadfileName = savefile.getName(); // 向jsp页面输出上传成功的信息 out.print("<script>alert( " + "‘" + uploadfileName + show + "‘" + ");location.href=‘index.jsp‘;</script>"); } else { // 向jsp页面输出上传失败的信息 out.print("<script>alert(‘文件上传失败‘);location.href=‘index.jsp‘;</script>"); } } } } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { out .print("<script>alert(‘系统内部错误‘);location.href=‘index.jsp‘;</script>"); } } }