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

在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应用所在的服务器的文件夹下了,在数据库中只需要存它的相对路径就可以了.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值