Java文件上传细讲(2)

那么我们要怎么办呢????request对象提供了ServletInputStream流给我们读取数据

我们试着读取下文件


ServletInputStream inputStream = request.getInputStream();

        byte[] bytes = new byte[1024];
        int len = 0;

        while ((len = inputStream.read(bytes)) > 0) {
            System.out.println(new String(bytes, 0, len));
        }


我上传的文本文件内容就是111111,读取效果如下:



Java文件上传细讲(2)


现在我们能够读取上传文件的数据了,但是现在问题又来了:怎么把文件上传个数据和普通传送给服务器的数据分割开来呢???上面在图上我们已经看到了,他们是混合在一起的。


按我们平常的做法是很难分割开来的,所以我们需要上传组件


上传组件有两种

FileUpload【操作比较复杂】

SamrtUpload【操作比较简单】


FileUpload

要使用FileUpload组件,就需要导入两个jar包


commons-io

Commons-fileupload


开发步骤

创建解析器工厂对象【DiskFileItemFactory】

通过解析器工厂创建解析器【ServletFileUpload】

调用解析器方法解析request对象,得到所有上传的内容【list】


遍历list,判断每个对象是否是上传文件


如果是普通表单字段,得到字段名和字段值

如果是上传文件,调用InputSteam方法得到输入流,读取上传的数据


快速入门


 try{

            //1.得到解析器工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();

            //2.得到解析器
            ServletFileUpload upload = new ServletFileUpload(factory);

            //3.判断上传表单的类型
            if(!upload.isMultipartContent(request)){
                //上传表单为普通表单,则按照传统方式获取数据即可
                return;
            }

            //为上传表单,则调用解析器解析上传数据
            List<FileItem> list = upload.parseRequest(request);  //FileItem

            //遍历list,得到用于封装第一个上传输入项数据fileItem对象
            for(FileItem item : list){

                if(item.isFormField()){
                    //得到的是普通输入项
                    String name = item.getFieldName();  //得到输入项的名称
                    String value = item.getString();
                    System.out.println(name + "=" + value);
                }else{
                    //得到上传输入项
                    String filename = item.getName();  //得到上传文件名  C:\Documents and Settings\ThinkPad\桌面\1.txt
                    filename = filename.substring(filename.lastIndexOf("\\")+1);
                    InputStream in = item.getInputStream();   //得到上传数据
                    int len = 0;
                    byte buffer[]= new byte[1024];

                    String savepath = this.getServletContext().getRealPath("/upload");
                    FileOutputStream out = new FileOutputStream(savepath + "\\" + filename);  //向upload目录中写入文件
                    while((len=in.read(buffer))>0){
                        out.write(buffer, 0, len);
                    }

                    in.close();
                    out.close();
                }
            }

        }catch (Exception e) {
            e.printStackTrace();
        }


测试

普通的字段和上传的文件都能读取得到了!


Java文件上传细讲(2)



上一篇:面向接口编程的优点


下一篇:QT creator中Debug、Profile、Release的区别