1. 程式人生 > >eclipse用法之java中文件的上傳操作

eclipse用法之java中文件的上傳操作

服務器 lock 內容 div use continue type dex ole

一、單文件上傳:
    1.首先前端頁面的編寫只有一個註意項:就是上傳的文件中有圖片時更改表單項的entype屬性為:enctype="multipart/form-data"

      簡單說明一下:表單中enctype="multipart/form-data"的意思,是設置表單的MIME編碼。默認情況,這個編碼格式是application/x-www-form-urlencoded,不能用於文件    上傳;  只有使用了multipart/form-data,才能完整的傳遞文件數據,進行下面的操作.
      想知道具體為什麽的可以百度一下

      下面是筆者寫的前端jsp頁面(特別簡陋):

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/BServlet" method="post"  enctype="multipart/form-data">
        昵稱:
<input type="text" name="Name"><br /> <input type="file" name="File"> <br /> <input type="submit" value="上傳"> </form> </body> </html>

    2.servlet的編寫:

      2.1首先是導包:

        > 我們一般情況下使用commons-fileupload-1.3.1.jar這個工具來解析多部件請求。
      > fileupload 依賴 commons-io 所以我們要是Filtupload需要同時導入io包。

所以我們需要導入的兩個包筆者已經上傳到百度雲了,需要的朋友可以在這下載(鏈接:http://pan.baidu.com/s/1c17Ohqw 密碼:v3g8)

      2.2接下來編寫servlet:

        先來做一些簡單的說明:

          DiskFileItemFactory - 工廠類,用於構建一個解析器實例。
         ServletFileUpload - 解析器類,通過該類實例來解析request中的請求信息。

          FileItem - 工具會將我們請求中每一個部件,都封裝為一個FileItem對象,處理文件上傳時,只需要調用該對象的方法
       - 方法:
       boolean isFormField() --> 當前表單項是否是一個普通表單項,true是普通表單項, false是文件表單項
       String getContentType() --> 返回的是文件的類型,是MIME值
       String getFieldName() --> 獲取表單項的name屬性值
      String getName() --> 獲取上傳的文件的名字
       long getSize() --> 獲取文件的大小
      String getString(String encoding) --> 獲取表單項的value屬性值,需要接受一個編碼作為參數。
      void write(File file) --> 將表單項中的內容寫入到磁盤中
              (這是我們經常需要用到的一些方法)
        > 使用步驟:
        1.獲取工廠類實例[DiskFileItemFactory]
         2.獲取解析器類實例[ServletFileUpload]
        3.解析request獲取FileItem[parseRequest()]

      下面是筆者寫的一段簡短的servlet代碼(將上傳的文件保存到電腦),希望對大家有寫幫助:

  

protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        // 用於測試前端頁面是否與servlet連接好
        System.out.println("連接沒問題");
        // 工廠類
        DiskFileItemFactory dfif = new DiskFileItemFactory();
        // 用於文件上傳
        ServletFileUpload fileupload = new ServletFileUpload(dfif);
        // 設置文件大小(單個文件大小限制100k)
        fileupload.setFileSizeMax(1034 * 100);
        try {
            // 獲取前端上傳的文件
            List<FileItem> fileList = fileupload.parseRequest(request);
            for (FileItem item : fileList) {
                if (item.isFormField()) {
                    // 普通表單項(也就是jsp頁面中name="Name"中的內容)
                    String name = item.getFieldName();
                    String value = item.getString("utf-8");
                    System.out.println(name + ":" + value);
                } else {
                    // 文件表單項
                    long size = item.getSize();
                    //文件的下載位置C:/Users/TYD/Desktop/123.jpg並命名為123.jpg
                    String path = "C:/Users/TYD/Desktop/123.jpg";
                    File f = new File(path);
                    try {
                        item.write(f);
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        } catch (FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

  try和catch是拋出異常

    下面這段代碼是將上傳的文件保存服務器:

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("連接沒問題");
        //工廠類
        DiskFileItemFactory dfif=new DiskFileItemFactory();
        //用於文件上傳
        ServletFileUpload fileupload=new ServletFileUpload(dfif);
        //設置文件大小(單個文件大小限制50k)
        fileupload.setFileSizeMax(1034*50);

        //設置服務器地址
        ServletContext servletContext = request.getServletContext();
        //在服務器創建一個upload文件
        String realPath = servletContext.getRealPath("/upload");
        System.out.println("realPath"+realPath);
        File file = new File(realPath);
        //判斷文件是否為空
        if(!file.exists()){
            //如果文件不存在,創建文件
            file.mkdir();
        }
        try {
            //獲取前端上傳的文件
            List<FileItem> fileList=fileupload.parseRequest(request);
            for(FileItem item:fileList){
                if(item.isFormField()){
                    //普通表單項
                    String name=item.getFieldName();
                    String value=item.getString("utf-8");
                    System.out.println(name+":"+value);
                }else{
                    //文件表單項
                    long size=item.getSize();//獲取文件格式
                    //防止上傳空文件
                    if(size ==0){
                        continue;
                    }
                    
                    System.out.println("size:"+size);
                    //設置新創建的文件的名字
                    String contentType = item.getContentType();
                    String name = item.getName();
                    if(name.contains("\\")){
                        name = name.substring(name.lastIndexOf("\\")+1);
                    }
                    System.out.println("name:"+name);
                    //防止同名文件覆蓋
                    String prefix = UUID.randomUUID().toString();
                    //去除文件中的-
                    prefix = prefix.replace("-","");
                    String fileName = prefix+"_"+name;
                    String fieldName = item.getFieldName();
                    System.out.println(size+":"+contentType+":--------"+name+":"+fieldName);
                    
                    try {
                        item.write(new File(realPath+"\\"+fileName));
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }catch(FileSizeLimitExceededException e){
            System.out.println("文件大小不可以超過50K");
        } catch (FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }

  接下來便是上傳多個文件到服務器

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("連接沒問題");
        //工廠類
        DiskFileItemFactory dfif=new DiskFileItemFactory();
        //用於文件上傳
        ServletFileUpload fileupload=new ServletFileUpload(dfif);
        //設置多個文件總大小
        fileupload.setSizeMax(1024*200);
        //設置服務器地址
        ServletContext servletContext = request.getServletContext();
        //在服務器創建一個upload文件
        String realPath = servletContext.getRealPath("/upload");
        System.out.println("realPath"+realPath);
        File file = new File(realPath);
        //判斷文件是否為空
        if(!file.exists()){
            //如果文件不存在,創建文件
            file.mkdir();
        }
        try {
            //獲取前端上傳的文件
            List<FileItem> fileList=fileupload.parseRequest(request);
            for(FileItem item:fileList){
                if(item.isFormField()){
                    //普通表單項
                    String name=item.getFieldName();
                    String value=item.getString("utf-8");
                    System.out.println(name+":"+value);
                }else{
                    //文件表單項
                    long size=item.getSize();//獲取文件格式
                    //防止上傳空文件
                    if(size ==0){
                        continue;
                    }
                    
                    System.out.println("size:"+size);
                    //設置新創建的文件的名字
                    String contentType = item.getContentType();
                    String name = item.getName();
                    if(name.contains("\\")){
                        name = name.substring(name.lastIndexOf("\\")+1);
                    }
                    System.out.println("name:"+name);
                    //防止同名文件覆蓋
                    String prefix = UUID.randomUUID().toString();
                    prefix = prefix.replace("-","");
                    String fileName = prefix+"_"+name;
                    String fieldName = item.getFieldName();
                    System.out.println(size+":"+contentType+":--------"+name+":"+fieldName);
                    
                    try {
                        item.write(new File(realPath+"\\"+fileName));
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }catch(SizeLimitExceededException e){
            System.out.println("總大小不可以超過150k");
        } catch (FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }

好了,關於文件的上傳就到這裏。希望對大家有些幫助。。。

eclipse用法之java中文件的上傳操作