A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王超举 初级黑马   /  2017-8-8 10:26  /  947 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王超举 于 2017-8-8 10:33 编辑

    关于上传有很多中技术实现手段如:struts2、FileUpload、Servlet3.0等都可以。今天我们来说下Servlet3.0实现上传功能开发。
     首先要完成上传必须满足三个前提:
1、有上传项,即在表单中要有<input type="file" name="upload">这一项。
2、表单提交方式必须为post,为什么不能用get呀?这点很好理解,因为get有大小限制
3、上传的form表单中enctype属性值必须为multipart/form-data。为什么必须这么设置呢?看下图。一个是未设置采用默认、一个是设置之后的,很明显只有设置之后上传的头信息里才提交上传的内容。未设置的时候上传的头信息里没有上传的内容。
              满足这三个前提后,我们就可以开发了。不难看出,我们的表单中有两项,设置enctype="multipart/form-data"后,上传项被3条分割线分割成两部分,就是我们form表单中的两项,一项是普通输入、一项是上传的文件。
       在servlet3.0里,上传项被封装到了一个part对象中,我们可以操作part对象完成上传,开发步骤如下。
           1、获取文件名、输入流。
           2、创建输出流
           3、完成上传。
      注意:part.getName()获得的并不是上传的文件名,而是上传项的名。要活的上传的文件名,需要获取Content-Disposition后面的字符串,之后操作字符串得到。具体实现看如下代码。
[Java] 纯文本查看 复制代码
private void Upload2(HttpServletRequest request, HttpServletResponse response) 
                        throws ServletException, IOException {
                        Part part = request.getPart("upload");
                        String name = part.getName();
                        String header = part.getHeader("Content-Disposition");
                        int i = header.lastIndexOf("filename=\"");
                        //获取上传的文件名
                        String fileName = header.substring(i+10, header.length()-1);
                        System.out.println("文件名大小是:"+part.getSize());
                        System.out.println("文件名是:"+fileName+"=====文件上传项的value属性值是:"+name);
                        System.out.println("文件头信息Content-Disposition是:"+header);
                        //获取输入流
                        InputStream is = part.getInputStream();
                        String realPath = request.getServletContext().getRealPath("/upload");
                        //创建输出流
                        FileOutputStream os = new FileOutputStream(realPath+"/"+fileName);
                        //读写操作
                        byte[] byts = new byte[1024];
                        int len = 0;
                        while ( (len = is.read(byts)) != -1 ) {
                                os.write(byts, 0, len);
                        }
                        //IOUtils.copy(is, os);
                        //关闭流
                        os.close();
                        is.close();
                }

多学一招:
       我们看代码的关于读写的操作,用了五行代码。比较繁琐,在commons-io-1.4.jar中给我们提供了关于复制的操作,一行代码就能搞定。就是IOUtils.copy(is, os)。
附件为commons-io-1.4.jar的jar包。



lib.zip

95.8 KB, 下载次数: 44

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马