欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaWeb servlet實現下載與上傳功能的方法詳解

 更新時間:2020年04月10日 09:30:56   作者:隨風行云  
這篇文章主要介紹了JavaWeb servlet實現下載與上傳功能的方法,結合實例形式詳細分析了JavaWeb servlet實現下載與上傳功能的原理、實現方法與操作注意事項,需要的朋友可以參考下

本文實例講述了JavaWeb servlet實現下載與上傳功能的方法。分享給大家供大家參考,具體如下:

本文內容:

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

首發(fā)日期:2018-07-21


servlet實現下載功能

實現流程

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

image

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

image

中文文件名問題:

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

先給出觸發(fā)的條件:image

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

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

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

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

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

處理方法:

image

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.創(chuàng)建一個頁面,用于上傳:【這里只用了一個上傳,但事實上下面的代碼是支持多個上傳的】

image

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

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

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

4.創(chuàng)建解析類,用于解析resquest:ServletFileUpload upload=new ServletFileUpload(factory);

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

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

image

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.創(chuàng)建DiskFileItemFactory工廠類
    ServletFileUpload upload=new ServletFileUpload(factory);//2.創(chuàng)建解析類,用于解析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();
    }
    
    
  }

更多關于java算法相關內容感興趣的讀者可查看本站專題:《Java文件與目錄操作技巧匯總》、《Java數據結構與算法教程》、《Java操作DOM節(jié)點技巧總結》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設計有所幫助。

相關文章

  • nacos單機版啟動失敗問題以及解決

    nacos單機版啟動失敗問題以及解決

    這篇文章主要介紹了nacos單機版啟動失敗問題以及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 詳解重試框架Spring retry實踐

    詳解重試框架Spring retry實踐

    spring retry是從spring batch獨立出來的一個能功能,主要實現了重試和熔斷。這篇文章主要介紹了詳解重試框架Spring retry實踐,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 詳解Java中的Reflection反射和暴力反射

    詳解Java中的Reflection反射和暴力反射

    本文主要介紹了詳解Java中的Reflection反射和暴力反射,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • java使用FFmpeg合成視頻和音頻并獲取視頻中的音頻等操作(實例代碼詳解)

    java使用FFmpeg合成視頻和音頻并獲取視頻中的音頻等操作(實例代碼詳解)

    這篇文章主要介紹了java使用FFmpeg合成視頻和音頻并獲取視頻中的音頻等操作,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • java簡單坦克大戰(zhàn)制作代碼

    java簡單坦克大戰(zhàn)制作代碼

    這篇文章主要介紹了java簡單坦克大戰(zhàn)制作代碼,利用Java語言中的集合、Swing、線程等知識點編寫一個坦克大戰(zhàn)游戲,需要的朋友可以參考下
    2016-07-07
  • Netty分布式高性能工具類recycler的使用及創(chuàng)建

    Netty分布式高性能工具類recycler的使用及創(chuàng)建

    這篇文章主要為大家介紹了Netty分布式高性能工具類recycler的使用和創(chuàng)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • 基于SpringBoot集成測試遠程連接Redis服務的教程詳解

    基于SpringBoot集成測試遠程連接Redis服務的教程詳解

    這篇文章主要介紹了基于SpringBoot集成測試遠程連接的Redis服務的相關知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Java實現駝峰和下劃線互相轉換的示例代碼

    Java實現駝峰和下劃線互相轉換的示例代碼

    Java對各種變量、方法和類等要素命名時使用的字符序列稱為標識符,凡是自己可以起名字的地方都叫標識符。本文為大家分享了Java中如何實現駝峰命名與下劃線命名的互轉,感興趣的可以了解一下
    2022-05-05
  • 詳解springboot中使用異步的常用兩種方式及其比較

    詳解springboot中使用異步的常用兩種方式及其比較

    這篇文章主要介紹了詳解springboot中使用異步的常用兩種方式及其比較,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • Java設計模式之淺談模板方法模式

    Java設計模式之淺談模板方法模式

    今天給大家?guī)淼氖顷P于Java設計模式的相關知識,文章圍繞著Java模板方法展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06

最新評論