文件上傳與下載

文件上傳與下載

1. 文件上傳

  • maven依賴
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.2</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.5</version>
</dependency>

1.1 前臺頁面

<form action="/xx/controller" method="post" enctype="multipart/form-data">
    <input type="file" name="headimg" value="${stu.headimg}">
    <input type="submit" value="確定提交">
</form>

1.2 抽取工具類

  • 需要注意的問題:同一個req對象只能被parseRequest(req)解析一次,如果進行第二次解析,req對象中攜帶的表單數據全部爲空。
//文件上傳
public class FileUploadUtil {

    static List<String> list = Arrays.asList("jpg","png","bmp");

    /**
     * 文件上傳
     * @param req
     * @return
     */
    public static Map<String,String[]> upload(HttpServletRequest req){
        DiskFileItemFactory factory = new DiskFileItemFactory();
         /*//設置緩存目錄   緩存一般不用設置,默認的就好
        factory.setRepository(new File("F:/temp"));
        //設置緩存目錄大小
        factory.setSizeThreshold(1024*1024*2);*/
        ServletFileUpload upload = new ServletFileUpload(factory);
        Map<String,String[]> map = new HashMap<>();
        try {
            //設置限制單個文件大小
            upload.setFileSizeMax(1024*1024);//30kb
            //設置限制總的文件的大小
            upload.setSizeMax(1024*1024*2);//2M
            //從request對象中獲取所有的元素
            List<FileItem> fileItems = upload.parseRequest(req);
            //迭代器迭代request對象中的所有元素
            Iterator<FileItem> iterator = fileItems.iterator();
            while (iterator.hasNext()){
                //得到單個元素
                FileItem item = iterator.next();
                //如果是普通的字段
                if(item.isFormField()){
                    //獲取字段的名稱
                    String fieldName = item.getFieldName();
                    String value = item.getString("UTF-8");
                    //如果已經有同名的字段(複選框)
                    if(map.containsKey(fieldName)){
                        //以前map集合中的值
                        String[] oldvalue = map.get(fieldName);
                        //構建一個新的數組,長度爲舊的數組的長度加1
                        String[] newvalue = new String[oldvalue.length+1];
                        //將舊數組的中的元素全部拷貝到新的數組中
                        System.arraycopy(oldvalue,0,newvalue,0,oldvalue.length);
                        //將讀取的value放入數組的最後一個元素
                        newvalue[newvalue.length-1] = value;
                        //將這個新的數組添加到map集合中
                        map.put(fieldName,newvalue);
                    }
                    //一個字段對應一個值
                    if(!map.containsKey(fieldName)){
                        map.put(fieldName,new String[]{value});
                    }
                }else if(item.getSize()==0){//item.getSize()如果爲零,表示用戶沒有上傳文件
                    map.put("headimg",null);//將headimg字段設置爲null
                }else{//如果上傳的是文件
                    //文件的名稱:因爲瀏覽器的不同,這個filename有可能包含的是全限定名
                    String filename = item.getName();
                    //獲取文件的名稱
                    String name = FilenameUtils.getName(filename);
                    //獲取到本項目下的img目錄的絕對路徑
                    String realPath = req.getServletContext().getRealPath("/img");
                    //創建目錄
                    File dir = new File(realPath);
                    dir.mkdirs();
                    //解決文件名稱重複的問題
                    String uuid = UUIDUtil.getUUID();
                    //獲取文件的後綴名
                    String extension = FilenameUtils.getExtension(filename);
                    //如果不是指定的文件後綴名
                    if(!list.contains(extension)){
                        throw new AutoException("不是指定的文件,請選擇jpg、png格式的文件!");
                    }
                    String path = req.getServletContext().getContextPath()+"/img/"+uuid+"-"+name;
                    //將文件的路徑保存到map集合中,方便beanutil拷貝到實體中進行持久化操作
                    map.put("headimg",new String[]{path});
                    //文件保存的路徑
                    File uploadFile = new File(dir,uuid+"-"+name);
                    item.write(uploadFile);
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章