Servlet处理文件的上传学习总结

在学习中遇到要求上传图片的问题

下面是表单的具体数据:
在这里插入图片描述
这里的表单提交的Action就进入后台页面获取数据:
但是不能通过简单的数据封装,需要把图片给保存到数据库,但是用什么方式保存图片到数据库,并且能够快速读出来

思考到这里就开始第二步:

 public void addBook(HttpServletRequest request, HttpServletResponse response) {
        Book book = uploadBook(request);
    }

    /**
     * 单独封装数据Book
     */
    protected Book uploadBook(HttpServletRequest request) {
        //处理文件的上传
        Book book = new Book();
        try {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload load = new ServletFileUpload(factory);
            List<FileItem> list = load.parseRequest(request);
        } catch (Exception e) {

        }
    }在这里插入代码片

这里需要的jar什么就不再述说了!上来就是apache的创建,接受一个request把表单的所有的数据给封装成为一个List集合,但是泛型是,这里我们先输出集合集合,这样更加有利于我们理解:
下面是debug模式输出list集合的FileItem
在这里插入图片描述
可以发现除了type类型是file的input输入框的isFormFiled是true;
可以用设个属性来判断哪个属性是file就可以进行逻辑分析

List<FileItem> list = load.parseRequest(request);
            for(int i = 0;i<list.size();i++){
                FileItem item = list.get(i);
                if (item.isFormField()){
                    //获取属性
                    String fieldName = item.getFieldName();
                    //获取我们输入的值
                    String fieldValue = item.getString("utf-8");
                    //可以输出看看是什么
                    System.out.println(fieldName+"--->"+fieldValue);
                }
            }

输出的值是:

name--->网易音乐热评
author--->小明
price--->99.99
des--->新垣结衣
categoryId--->0d1ea491-62f9-4a8d-82bd-ec077a08e034

这里获取的就是页面对应的name和value里面的值
到这里就可以利用BeanUtils来封装数据模型

 if (item.isFormField()){
                    //获取属性
                    String fieldName = item.getFieldName();
                    //获取我们输入的值
                    String fieldValue = item.getString("utf-8");
                    //可以输出看看是什么
                    //System.out.println(fieldName+"--->"+fieldValue);
                    //利用BeanUtils来封装数据(获取的属性name 必须和传入的book属性一一对应)
                    BeanUtils.setProperty(book,fieldName,fieldValue);
                    //单独处理分类的id
                    if ("categoryId".equals(fieldName)){
                        //调用业务逻辑
                        Category category = businessService.findCategoryById(fieldValue);
                        //添加book里面的属性
                        book.setCategory(category);
                    }

到此为止我们已经把type类型不是file的都完成了封装了
下面就是重点如何处理file类型的type

					//获取传入图片的所有名称(就是把你上传文件的名字获取)
                    String file_name = item.getName();
                    //获取文件的扩展名(jpg npg)这个是工具类的方法
                    String extension = FilenameUtils.getExtension(file_name);
                    //随机生成文件的名字(需要改变图片的名称)
                    file_name = UUID.randomUUID().toString()+"."+extension;
                    //把路径保存到book
                    book.setFilename(file_name);
                    //开始玩一些好玩的
                    //获取文件要保存的路径
                    //获取文件的要保存的文件夹
                    String rootDirectory = this.getServletContext().getRealPath("/images");
                    //System.out.println("1-->"+rootDirectory);//D:\workhard\out\artifacts\day27_book_war_exploded\images
                    //根绝文件夹名称创建图片要保存的文件夹
                    //在idea中如果不创建那么也就是为空那程序在这里就会报错误
                    String childPath = getStoreDirecotry(rootDirectory);
                    //System.out.println("2-->"+childPath);
                    book.setPath(childPath);
                    //继续
                    String str = rootDirectory+File.separator+childPath+File.separator+file_name;
                    //System.out.println(str);//D:\workhard\out\artifacts\day27_book_war_exploded\images\2018-12-19\2fd7f4cd-8287-47a7-91d0-555655755321.jpg
                    //文件上传 这个是工具类的里面的方法
                    item.write(new File(str));

以下是工具类的获取文件名称的方法

private String getStoreDirecotry(String rootDirectory) {
        Date now = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        String path = df.format(now);
        File file = new File(rootDirectory,path);
        if(!file.exists()){
            file.mkdirs();
        }
        return path;
    }

以上就是上传文件的方法
所有的代码如下:

/**
     * 单独封装数据Book
     */
    protected Book uploadBook(HttpServletRequest request, BusinessService businessService) {

        //处理文件的上传
        Book book = new Book();
        try {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload load = new ServletFileUpload(factory);
            List<FileItem> list = load.parseRequest(request);
            for (int i = 0; i < list.size(); i++) {
                FileItem item = list.get(i);
                if (item.isFormField()) {
                    //获取属性
                    String fieldName = item.getFieldName();
                    //获取我们输入的值
                    String fieldValue = item.getString("utf-8");
                    //可以输出看看是什么
                    //System.out.println(fieldName+"--->"+fieldValue);
                    //利用BeanUtils来封装数据(获取的属性name 必须和传入的book属性一一对应)
                    BeanUtils.setProperty(book, fieldName, fieldValue);
                    //单独处理分类的id
                    if ("categoryId".equals(fieldName)) {
                        //调用业务逻辑
                        Category category = businessService.findCategoryById(fieldValue);
                        //添加book里面的属性
                        book.setCategory(category);
                    }
                } else {
                    //获取传入图片的所有名称
                    String file_name = item.getName();
                    //获取文件的扩展名(jpg npg)
                    String extension = FilenameUtils.getExtension(file_name);
                    file_name = UUID.randomUUID().toString()+"."+extension;
                    //把路径保存到book
                    book.setFilename(file_name);
                    //开始玩一些好玩的
                    //获取文件要保存的路径
                    String rootDirectory = this.getServletContext().getRealPath("/images");
                    //System.out.println("1-->"+rootDirectory);//D:\workhard\out\artifacts\day27_book_war_exploded\images
                    String childPath = getStoreDirecotry(rootDirectory);
                    //System.out.println("2-->"+childPath);
                    book.setPath(childPath);
                    //继续
                    String str = rootDirectory+File.separator+childPath+File.separator+file_name;
                    //System.out.println(str);//D:\workhard\out\artifacts\day27_book_war_exploded\images\2018-12-19\2fd7f4cd-8287-47a7-91d0-555655755321.jpg
                    //文件上传
                    item.write(new File(str));
                }
            }
        } catch (Exception e) {

        }
        return book;
        }
        //这是随机获取文件名称的方法
private String getStoreDirecotry(String rootDirectory) {
        Date now = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        String path = df.format(now);
        File file = new File(rootDirectory,path);
        if(!file.exists()){
            file.mkdirs();
        }
        return path;
    }

这是基于Servlet的文件的上传方法

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值