首先实现图片上传要将jsp页面的form类型改为多enctype="multipart/form-data",即设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,当有了这个设置,就可以在servlet中获取了:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); News news = new News(); try { // 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(4096); // 设置缓冲区大小,这里是4kb // 用以上工厂实例化上传组件 ServletFileUpload upload = new ServletFileUpload(factory); upload.setSizeMax(4194304); // 设置最大文件尺寸,这里是4MB // 设置上传的地址 String uploadPath = this.getServletContext().getRealPath( "/upload/images"); System.out.println("uploadPath=====" + uploadPath); List items = upload.parseRequest(request);// 得到所有的上传文件 Iterator it = items.iterator(); // 逐条处理 while (it.hasNext()) { // 得到当前文件 FileItem fi = (FileItem) it.next(); // 检查当前项目是普通表单项目还是上传文件 if (fi.isFormField()) {// 如果是普通表单项目,显示表单内容。 request.setCharacterEncoding("utf-8"); if ("title".equals(fi.getFieldName())) { news.setTitle(fi.getString("utf-8")); System.out.println(fi.getString("utf-8")); } else if ("time".equals(fi.getFieldName())) { news.setTime(fi.getString("utf-8")); System.out.println(fi.getString("utf-8")); } else if ("focus".equals(fi.getFieldName())) { int focus = 0; if ("on".equals(fi.getString("utf-8"))) {
focus = 1; } news.setFocus(focus); System.out.println(focus); } } else { // 得到文件的完整路径 Format format = new SimpleDateFormat("yyyyMMdd_HHmmss"); Date date = new Date(); String path = fi.getName(); // 得到去除路径的文件名 String filename = path .substring(path.lastIndexOf("\") + 1);
//为了避免下载文件时出现中文传输参数乱码,故将文件存储名设置为年月日+加时分秒+3位随机数,当上传一个文件时完全可以不使用随机数, String type = null; if (!"".equals(filename) && filename != null) {//也可以添加判断条件:&&fi.getSize()!=0 int b = (int) (Math.random() * 1000); type = filename.substring(filename.length() - 4, filename.length()); filename = format.format(date) + b + type; System.out.println(filename); // 将文件保存在Web目录的upload文件夹中 if ("pic_1".equals(fi.getFieldName())) { news.setPic_1(fi.getName()); news.setPic_1path(filename);//path为文件名被重新定义后的名称,需要被存入数据库中 System.out.println("11111" + fi.getName()); } if ("pic_2".equals(fi.getFieldName())) { news.setPic_2(fi.getName()); news.setPic_2path(filename); System.out.println("22222" + fi.getName()); } if ("pic_3".equals(fi.getFieldName())) { news.setPic_3(fi.getName()); news.setPic_3path(filename); System.out.println("33333" + fi.getName()); } fi.write(new File(uploadPath, filename)); }} } News.addNews(news);//此处为javabean中定义的添加记录的方法,用于将信息存入数据库 } catch (FileUploadException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } request.getRequestDispatcher("QueryNewsByConditionServlet.do").forward( request, response);
下面是jsp页面部分代码(仅供参考):
<form name="newsF" method="post" action="../servlet/addNewsServlet" enctype="multipart/form-data"> <table align="center" cellpadding="5" cellspacing="0" class="tab" id="js_table1"> <tr > <td class="TableData">标题:</td> <td class="input"> <input type="text" name="title" size="40"/> </td> </tr> <tr> <td class="TableData">发布时间:</td> <td class="input"> <input type="text" onFocus="WdatePicker({isShowClear:false,readOnly:true,dateFmt:'yyyy-MM-dd HH:mm:ss'})" size="20" name="time" /> </td> </tr> <tr ><td colspan="2"> <input type="checkbox" name="focus" /><font color="#E60000" face="仿宋" >将此新闻设置为焦点并在在首页显示</font></td> </tr> <tr> <td>添加图片1:</td> <td><input type="file" name="pic_1"/> </td> </tr> <tr> <td>添加图片2:</td> <td><input type="file" name="pic_2"/> </td> </tr> <tr> <td>添加图片3:</td> <td><input type="file" name="pic_3"/> </td> </tr>