最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaWeb servlet實(shí)現(xiàn)下載與上傳功能的方法詳解

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

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

本文內(nèi)容:

  • servlet實(shí)現(xiàn)下載功能
  • servlet實(shí)現(xiàn)上傳功能

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


servlet實(shí)現(xiàn)下載功能

實(shí)現(xiàn)流程

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

image

2.設(shè)置響應(yīng)信息,告訴瀏覽器要將傳過來的數(shù)據(jù)識(shí)別成下載;根據(jù)提交上來的數(shù)據(jù)找到對(duì)應(yīng)文件,轉(zhuǎn)成流,返回給瀏覽器;

image

中文文件名問題:

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

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

中文文件名需要解決兩個(gè)問題:

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

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

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

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

處理方法:

image

protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    // 1.獲取下載目標(biāo)
    String filename = request.getParameter("target");
    System.out.println(filename);
    // 2.找到下載目標(biāo)
    String path = getServletContext().getRealPath("download/" + filename);
    File file = new File(path);
    if (file.exists()) {
      // 3.如果文件存在,那么設(shè)置響應(yīng)的內(nèi)容為下載,告訴瀏覽器將信息識(shí)別成下載
      // 判斷一下瀏覽器
      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實(shí)現(xiàn)上傳功能

1.創(chuàng)建一個(gè)頁面,用于上傳:【這里只用了一個(gè)上傳,但事實(shí)上下面的代碼是支持多個(gè)上傳的】

image

【當(dāng)使用了enctype="multipart/form-data"之后,普通輸入框的內(nèi)容,將無法使用getParameter獲取

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

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

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

5.解析內(nèi)容,獲取一個(gè)list,數(shù)據(jù)都存儲(chǔ)在list中:List<FileItem> list = upload.parseRequest(request);

現(xiàn)在信息封裝方法已經(jīng)跟之前沒有文件上傳時(shí)不一樣了,所以需要解析:

image

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

如何操作?

對(duì)于普通表單項(xiàng):item.getFieldName()可以獲取對(duì)應(yīng)的name;item.getString()可以獲取對(duì)應(yīng)的值

對(duì)于上傳項(xiàng),需要操作它的流:item.getInputStream()可以獲取對(duì)應(yīng)的數(shù)據(jù)流。

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.解析內(nèi)容,獲取一個(gè)list,數(shù)據(jù)都存儲(chǔ)在list中
      for(FileItem item:list) {
        if(item.isFormField()) {//判斷是否是普通的表單內(nèi)容
          System.out.println(item.getFieldName());//獲取的是表單中name屬性的值
          System.out.println(item.getString());//獲取的是對(duì)應(yīng)的表單的值
        }else {//為假,說明是上傳項(xiàng)
          //獲取流,進(jìn)行處理
          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();//這里不做文件存在性和名字重復(fù)判斷
          OutputStream fos = new FileOutputStream(file);
          //這里直接借助commons.io來做io對(duì)接,不然需要做流的讀取和寫入
          IOUtils.copy(ism,fos);//把輸入流的數(shù)據(jù)拷貝到輸出流
          IOUtils.closeQuietly(ism);
          IOUtils.closeQuietly(fos);
          
        }
      }
    } catch (FileUploadException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    
    
  }

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

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 用java實(shí)現(xiàn)冒泡排序算法

    用java實(shí)現(xiàn)冒泡排序算法

    兩兩比較待排序記錄的關(guān)鍵字,發(fā)現(xiàn)兩個(gè)記錄的次序相反時(shí)即進(jìn)行交換,直到?jīng)]有反序的記錄為止
    2013-01-01
  • Java Annotation詳解及實(shí)例代碼

    Java Annotation詳解及實(shí)例代碼

    這篇文章主要介紹了Java Annotation詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • springBoot自動(dòng)配置的全過程

    springBoot自動(dòng)配置的全過程

    這篇文章主要介紹了springBoot自動(dòng)配置的全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Spring排序機(jī)制之接口與注解的使用方法

    Spring排序機(jī)制之接口與注解的使用方法

    本文介紹了Spring中多種排序機(jī)制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了詳細(xì)示例,并指導(dǎo)如何選擇合適的排序機(jī)制來控制Bean的加載順序和優(yōu)先級(jí),感興趣的朋友一起看看吧
    2025-02-02
  • Java 實(shí)戰(zhàn)項(xiàng)目之倉庫管理系統(tǒng)的實(shí)現(xiàn)流程

    Java 實(shí)戰(zhàn)項(xiàng)目之倉庫管理系統(tǒng)的實(shí)現(xiàn)流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)倉庫管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • 作為程序員必須掌握的Java虛擬機(jī)中的22個(gè)重難點(diǎn)(推薦0

    作為程序員必須掌握的Java虛擬機(jī)中的22個(gè)重難點(diǎn)(推薦0

    這篇文章主要介紹了Java虛擬機(jī)中22個(gè)重難點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • SpringBoot中YAML語法及幾個(gè)注意點(diǎn)說明

    SpringBoot中YAML語法及幾個(gè)注意點(diǎn)說明

    這篇文章主要介紹了SpringBoot中YAML語法及幾個(gè)注意點(diǎn)說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 詳解SpringSecurity如何實(shí)現(xiàn)前后端分離

    詳解SpringSecurity如何實(shí)現(xiàn)前后端分離

    這篇文章主要為大家介紹了詳解SpringSecurity如何實(shí)現(xiàn)前后端分離,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Idea配置maven-tomcat-plugin插件實(shí)現(xiàn)項(xiàng)目部署

    Idea配置maven-tomcat-plugin插件實(shí)現(xiàn)項(xiàng)目部署

    今天小編就為大家分享一篇關(guān)于Idea配置maven-tomcat-plugin插件實(shí)現(xiàn)項(xiàng)目部署,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Java數(shù)據(jù)存儲(chǔ)的“雙子星”對(duì)決(Map和Set的區(qū)別)

    Java數(shù)據(jù)存儲(chǔ)的“雙子星”對(duì)決(Map和Set的區(qū)別)

    文章主要介紹了Java中Map和Set兩種數(shù)據(jù)結(jié)構(gòu)的定義、實(shí)現(xiàn)、方法及應(yīng)用場(chǎng)景,Map用于存儲(chǔ)鍵值對(duì),鍵唯一,值可重復(fù);Set用于存儲(chǔ)唯一元素,無序,兩者都提供了豐富的操作方法,如添加、刪除、查找等,感興趣的朋友一起看看吧
    2025-02-02

最新評(píng)論

漯河市| 丰原市| 吉首市| 张家界市| 额济纳旗| 漳州市| 绥宁县| 潮安县| 鄯善县| 沛县| 蕉岭县| 和平县| 枣阳市| 长汀县| 平阳县| 西青区| 梁山县| 浦北县| 泰州市| 开鲁县| 渭南市| 新蔡县| 盱眙县| 青铜峡市| 吴堡县| 盐源县| 绩溪县| 霍林郭勒市| 澄江县| 宝山区| 略阳县| 诏安县| 桑日县| 韶关市| 烟台市| 柳河县| 达孜县| 彰武县| 织金县| 安新县| 钦州市|