jsp+servlet实现多个图片(附件)和其他信息同时上传

 

  首先实现图片上传要将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>
原文地址:https://www.cnblogs.com/mecca/p/3310629.html