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的文件的上傳方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章