1. 程式人生 > >JavaWeb:servlet實現下載與上傳功能

JavaWeb:servlet實現下載與上傳功能

download lock contex posit 圖片 part 響應 exist left


本文內容:

  • servlet實現下載功能
  • servlet實現上傳功能

首發日期:2018-07-21


servlet實現下載功能

實現流程

1.首先制作一個jsp頁面,主要是用來觸發下載的。這裏可以根據你的想法來做,當然servlet那邊就要相應的更改了。我這裏使用一個簡單的a標簽來觸發。

技術分享圖片

2.設置響應信息,告訴瀏覽器要將傳過來的數據識別成下載;根據提交上來的數據找到對應文件,轉成流,返回給瀏覽器;

技術分享圖片

中文文件名問題:

  • 雖然真的不建議使用中文文件名。但還是給一下處理手段。

先給出觸發的條件:技術分享圖片

中文文件名需要解決兩個問題:

1.瀏覽器提交上來的中文文件名要識別:這裏是普通的get和post的中文數據問題

get方式:String filename = new String(filename.getBytes("iso-8859-1"),"utf-8"); 【tomcat8不需要】

post方式:request.setCharacterEncoding("utf-8")

2.返回給瀏覽器時,瀏覽器能識別,即能正確顯示回來的下載文件名(如果你下載東西遇到過文件名亂碼,就是這個沒處理好):

處理方法:

技術分享圖片

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            
throws ServletException, IOException { // 1.獲取下載目標 String filename = request.getParameter("target"); System.out.println(filename); // 2.找到下載目標 String path = getServletContext().getRealPath("download/" + filename); File file = new File(path);
if (file.exists()) { // 3.如果文件存在,那麽設置響應的內容為下載,告訴瀏覽器將信息識別成下載 // 判斷一下瀏覽器 String agent = request.getHeader("User-Agent"); if (agent.contains("Firefox")) {// 火狐 BASE64Encoder base64Encoder = new BASE64Encoder(); filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; } else {// ie和谷歌 filename = URLEncoder.encode(filename, "utf-8"); } response.setHeader("Content-Disposition", "attachment; filename=" + filename); // 4.獲取文件流 FileInputStream fis = new FileInputStream(file); OutputStream os = response.getOutputStream(); // 5.返回給瀏覽器 int len = 0; byte[] buffer = new byte[1024]; while ((len = fis.read(buffer)) != -1) { os.write(buffer, 0, len); } os.flush();// flush一下,確保一下 os.close(); fis.close(); } else { response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("找不到文件"); } }


servlet實現上傳功能

1.創建一個頁面,用於上傳:【這裏只用了一個上傳,但事實上下面的代碼是支持多個上傳的

技術分享圖片

【當使用了enctype="multipart/form-data"之後,普通輸入框的內容,將無法使用getParameter獲取

2.導入包,以便使用fileupload:commons-fileupload-1.2.1.jar和commons-io-1.4.jar【這裏導入io包主要是用於io流對接,上傳的文件流直接對接輸出流;如果你不導入,那麽需要手動處理流中的數據!】

3.創建DiskFileItemFactory工廠類,用來:DiskFileItemFactory factory=new DiskFileItemFactory();

4.創建解析類,用於解析resquest:ServletFileUpload upload=new ServletFileUpload(factory);

5.解析內容,獲取一個list,數據都存儲在list中:List<FileItem> list = upload.parseRequest(request);

現在信息封裝方法已經跟之前沒有文件上傳時不一樣了,所以需要解析:

技術分享圖片

6.操作list【list中的每一個元素都是FileItem對象,可以用FileItem對象.isFormField()來判斷是否是表單項(認為文件是上傳項);如果是真的話,說明是普通的輸入框內容,如果你想要存儲輸入框提交的內容,那麽這裏可以處理一下;不為真說明是上傳項,這裏可以針對流進行操作】

如何操作?

對於普通表單項:item.getFieldName()可以獲取對應的name;item.getString()可以獲取對應的值

對於上傳項,需要操作它的流:item.getInputStream()可以獲取對應的數據流。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        DiskFileItemFactory factory=new DiskFileItemFactory();//1.創建DiskFileItemFactory工廠類
        ServletFileUpload upload=new ServletFileUpload(factory);//2.創建解析類,用於解析resquest
        try {
            List<FileItem> list = upload.parseRequest(request);//3.解析內容,獲取一個list,數據都存儲在list中
            for(FileItem item:list) {
                if(item.isFormField()) {//判斷是否是普通的表單內容
                    System.out.println(item.getFieldName());//獲取的是表單中name屬性的值
                    System.out.println(item.getString());//獲取的是對應的表單的值
                }else {//為假,說明是上傳項
                    //獲取流,進行處理
                    InputStream ism = item.getInputStream();
                    String path=getServletContext().getRealPath("/upload/");
                    System.out.println(path);
                    String filename = item.getName();//這裏getName可以獲取文件名
                    System.out.println(filename);
                    File file=new File(path+filename);
                    file.createNewFile();//這裏不做文件存在性和名字重復判斷
                    OutputStream fos = new FileOutputStream(file);
                    //這裏直接借助commons.io來做io對接,不然需要做流的讀取和寫入
                    IOUtils.copy(ism,fos);//把輸入流的數據拷貝到輸出流
                    IOUtils.closeQuietly(ism);
                    IOUtils.closeQuietly(fos);
                    
                }
            }
        } catch (FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
    }


JavaWeb:servlet實現下載與上傳功能