JSP+Servlet使用commons.fileupload和commons.io完成图片上传

来源:互联网 发布:网络女主播排名 编辑:程序博客网 时间:2024/06/05 08:00

在jsp+servlet的项目中需要使用图片上传的功能,如果不把图片放在服务器上的话,每次都要从本机取出来,不能达到想要的效果,使用commons.fileupload和commons.io可以完成这个功能,

使用<input type="file">这个控件来选择要上传的图片,如图:
图片上传

然后来说下怎么将选中的图片上传到服务器中,这里先要将commons.fileupload和commons.io的jar包添加到lib下,
添加jar包

注意:使用时要在form处添加属性enctype=”multipart/form-data”,否则会报一个异常出来.

之后在servlet中写添加图片的具体方法:

public void doProAddWithFile(HttpServletRequest request,            HttpServletResponse response) throws ServletException, IOException {        PrintWriter out = response.getWriter();        // DiskFileItemFactory FileItem 对象的工厂,可以设定缓冲区大小和存放临时文件目录        DiskFileItemFactory factory = new DiskFileItemFactory();        // 设置内存缓冲区的大小为11k        factory.setSizeThreshold(11 * 1024);        // 指定保存上传文件的临时文件夹,自己定义        File f = new File("F://tempDirectory");        // setRepository方法用于设置当上传文件尺寸大于setSizeThreshold方法设置的临界值时,将文件以临时文件形式保存在磁盘上的存放目录。        factory.setRepository(f);        // 创建ServletFileUpload的实例        ServletFileUpload sfu = new ServletFileUpload(factory);        sfu.setHeaderEncoding("UTF-8");        // 设置单个上传文件的最大值为6M,该数据以字节为单位        sfu.setFileSizeMax(6000 * 1024);        try {            // 得到所有的输入项(每个控件)的集合            List<FileItem> items = sfu.parseRequest(request);            // 创建一个product对象            Product pro = new Product();            for (FileItem fileItem : items) {                // isFormField()为true表示当前控件是普通控件,为false表示它是上传控件                if (fileItem.isFormField()) {                    // 获取控件的名称,即每个请求参数的名称                    String name = fileItem.getFieldName();                    // 获取控件的值,加UTF-8防止中文乱码                    String value = fileItem.getString("UTF-8");                    // 对控件名即请求参数进行判断,依次封装到一个Product对象的属性中                    if (name.equals("serialNumber")) {                        pro.setPro_id(Integer.parseInt(value));                    } else if (name.equals("name")) {                        pro.setPro_name(value);                    } else if (name.equals("brand")) {                        pro.setPro_brand(value);                    } else if (name.equals("model")) {                        pro.setPro_version(value);                    } else if (name.equals("price")) {                        pro.setPro_price(Long.parseLong(value));                    } else if (name.equals("description")) {                        pro.setPro_introduce(value);                    }                } else {                    // 分析上传文件的数据                    // 获取上传文件的名称                    String fileName = fileItem.getName();                    // 获取上传文件的文件类型                    String contentType = fileItem.getContentType();                    // 获取上传文件的大小                    long size = fileItem.getSize();                    // 获取当前web应用根目录的绝对路径(Tomcat服务器部署工程的绝对路径)                    String path = this.getServletContext().getRealPath("/");                    // 获取保存上传文件的全路径                    String filePath = path + "images/" + fileName;                    // 获取封装了上传文件数据的输入流                    InputStream is = fileItem.getInputStream();                    // 输出流                    OutputStream os = new FileOutputStream(filePath);                    // 输出文件                    int len = 0;                    byte[] b = new byte[1024];                    while ((len = is.read(b)) != -1) {                        os.write(b, 0, len);                    }                    // 关闭流                    os.close();                    is.close();                    // 上传成功后,删除临时文件                    fileItem.delete();                    // 设置图片保存的相对路径,这是要存到数据库中的                    pro.setPro_image("images/" + fileName);                }            }

要先在服务器所在的路径下新建一个images文件夹,否则会出现找不到文件的异常,

这样就把选择的图片上传到web应用所在的服务器的文件夹下了,在数据库中只需要存它的相对路径就可以了.

2 0