溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaWeb怎么實現(xiàn)簡單文件上傳功能

發(fā)布時間:2022-06-23 09:53:09 來源:億速云 閱讀:149 作者:iii 欄目:開發(fā)技術

這篇文章主要講解了“JavaWeb怎么實現(xiàn)簡單文件上傳功能”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“JavaWeb怎么實現(xiàn)簡單文件上傳功能”吧!

1.概述

通常瀏覽器上傳的所有參數(shù),我們可以通過request對象的getParameter , getParameterMap , getParameterValue 這三個方法拿到所有的請求參數(shù),
但有一種情況,當強求包含參數(shù)包含文件上傳時, 這三個方法都失效,無法拿到參數(shù),
我們就需要request對象的getInputStream方法獲取這些參數(shù), 如何解析這個字節(jié)輸入流呢?
apache 軟件基金會: 開發(fā)了工具fileupload工具, 專門解析字節(jié)輸入流,實現(xiàn)文件上傳功能.

2. 先導入jar包

2.1打開pom文件, 加入fileupload的jar包依賴.

JavaWeb怎么實現(xiàn)簡單文件上傳功能

2.2 三要素

1.必須post請求
2.form表單屬性必須包含 enctype=“multipart/form-data”
3.上傳文本框input type=“file” , 必須有name屬性

JavaWeb怎么實現(xiàn)簡單文件上傳功能

2.3 代碼邏輯

自定義一個parseRequest(request)方法, 返回map集合,map集合中封裝了商品添加功能中提交所有的數(shù)據(jù);
使用BeanUtils.populate(product,parameterMap)方法將map集合封裝到product對象中; 調(diào)用業(yè)務層addProduct方法傳遞product對象參數(shù),在dao層將新添加的商品寫入數(shù)據(jù)庫;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Map<String, String[]> parameterMap = parseRequest(request);  //request.getParameterMap();
        Product product  = new Product();
        try {
            BeanUtils.populate(product,parameterMap);
        } catch (Exception e) {
            e.printStackTrace();
        }
        productService.addProduct(product);
        ResultVO resultVO = new ResultVO(ResultVO.SUCCESS,null,"商品添加成功");
        response.getWriter().print(objectMapper.writeValueAsString(resultVO));
    }

實現(xiàn)parseRequest(request)方法, 實現(xiàn)文件上傳功能:

private Map<String,String[]> parseRequest(HttpServletRequest request) {
        Map<String,String[]> map = new HashMap<String, String[]>();
        //創(chuàng)建對象,磁盤工廠對象
        DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
        //創(chuàng)建負責解析Request流的對象,構造方法,傳遞磁盤工廠對象
        ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);

        //獲取當前日期,文件夾名字使用
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String stringDate = sdf.format(new Date());

        try {
            //解析對象的方法,parseRequest,解析reqeust對象
            //返回集合 List, 集合的泛型,是另一個對象: 文件項對象
            //文件項對象: 客戶端提交的任何數(shù)據(jù),都認為是一個文件項 (普通文本框,附件上傳)
            //FileItem 客戶端的每一個上傳數(shù)據(jù) (當前案例是7 個 文件項)
            List<FileItem> fileItemList = servletFileUpload.parseRequest(request);
            //遍歷集合,獲取每個文件項對象  fileItem
            for(FileItem fileItem : fileItemList){
                //判斷  fileItem文件項對象方法,判斷出當前的文件項是普通文本,還是附件
                if (fileItem.isFormField()){ //isFormField()返回true,普通項 , 返回false 是附件
                    //普通文本,取出用戶在文本框輸入的數(shù)據(jù),帶編碼表名
                    String s = fileItem.getString("utf-8");
                    //方法: 獲取表單input的name的屬性值
                    String name = fileItem.getFieldName();
                   //System.out.println(name+"==="+s);
                    //數(shù)據(jù),封裝到Map集合
                    map.put(name,new String[]{s});
                }else {
                    //方法isFormField()返回false,是附件項
                    //FileItem對象方法 getName()獲取到上傳的文件名
                    String fileName = fileItem.getName();
                    //文件上傳,是需要修改文件名
                    //System.out.println(fileName); // Jellyfish.jpg
                    //獲取文件的后綴名,獲取文件名 . 出現(xiàn)的索引
                    int index =  fileName.lastIndexOf(".");
                    //截取字符串
                    fileName = fileName.substring(index);
                    //System.out.println(fileName);
                    //自定義新的文件名
                    fileName = "itheima"+System.currentTimeMillis()+ UUIDUtil.getId()+fileName;
                    //System.out.println(fileName);

                    /**
                     * 處理的上傳路徑,項目的目錄 E:\heima364\store\src\main\webapp\web\resources\products
                     * 開發(fā)的項目: 跨平臺運行
                     * Windows 系統(tǒng)路徑  E:\heima364\store\src\main\webapp\web\resources\products
                     * Linux 操作系統(tǒng) /ss/ss/ss/ss
                     * 路徑定義在配置文件中,讀取
                     */
                    ResourceBundle bundle = ResourceBundle.getBundle("uploadPath");
                    //上傳路徑,讀取配置文件
                    String path = bundle.getString("path");

                    //E:/heima364/store/src/main/webapp/web/resources/products /stringDate
                    //File對象實現(xiàn),路徑的合并 (上傳路徑path,和日期字符串合并為一個路徑)
                    File uploadDir = new File(path,stringDate); //E:\heima364\store\src\main\webapp\web\resources\products\2020-02-27
                    //判斷該路徑是否存在
                    if (!uploadDir.exists()){
                        //不存在,就創(chuàng)建
                        uploadDir.mkdirs();
                    }
                    //上傳的路徑 uploadDir 和文件名 fileName,組成一個新的File對象

                    //E:\heima364\store\src\main\webapp\web\resources\products\2020-02-27\itheima158279119698617ad226bf52d4eb4bc9cd97dbbd1fd5a.jpg
                    File uploadDirFile = new File(uploadDir,fileName);

                    //文件賦值,字節(jié)流讀取文件
                    //文件項對象的方法, getInputStream獲取輸入流,讀取的是上傳的文件
                    InputStream inputStream = fileItem.getInputStream();

                    //字節(jié)的輸出流
                    FileOutputStream fileOutputStream = new FileOutputStream(uploadDirFile);

                    //commonsIO工具的方法來實現(xiàn)
                    IOUtils.copy(inputStream,fileOutputStream);
                    fileOutputStream.close();

                    //從上傳的路徑中uploadDirFile,獲取出一部分路徑,寫入到數(shù)據(jù)庫
                    //File對象的方法toString(),路徑轉(zhuǎn)成字符串
                    //獲取resources出現(xiàn)的索引
                    index = uploadDirFile.toString().indexOf("resources");
                    String pimage = uploadDirFile.toString().substring(index);
                    //替換路徑中的 /
                    pimage =pimage.replace("\\","/");
                    //路徑,封裝到Map集合中/
                    map.put("pimage",new String[]{pimage});

                    fileItem.delete();//刪除上傳的臨時文件
                }
            }
        }catch (Exception ex){
            ex.printStackTrace();
        }
        //手動封裝Map中缺少的數(shù)據(jù)
        //商品主鍵
        map.put("pid",new String[]{UUIDUtil.getId()});

        //上架,固定為0
        map.put("pflag",new String[]{"0"});

        //商品的發(fā)布日期
        map.put("pdate",new String[]{stringDate});
        return map;
    }

感謝各位的閱讀,以上就是“JavaWeb怎么實現(xiàn)簡單文件上傳功能”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對JavaWeb怎么實現(xiàn)簡單文件上傳功能這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI