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

Springmvc模式上傳和下載與enctype對比

 更新時間:2020年12月07日 09:29:38   作者:夢澤千秋  
這篇文章主要介紹了Springmvc模式上傳和下載與enctype對比,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

一般表單數(shù)據(jù)分為兩類

<form method="post" action="${pageContext.request.contextPath}/upload" enctype="multipart/form-data">

enctype帶文件上傳的表單和不帶enctype的傳統(tǒng)表單,這兩種提交的數(shù)據(jù)有著不同的樣式,并且上傳文件只能使用enctype。

@Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("utf-8");
    resp.setContentType("text/html;charset=utf-8");
    //服務(wù)器存儲文件的地址,需自己定義
    String savepath = this.getServletContext().getRealPath("/upload");
    System.out.println(savepath);
    //如果文件不存在,需要先進(jìn)行判斷,并創(chuàng)建,否則會出現(xiàn)空文件報錯
    File file=new File(savepath);
    if(!file.exists()){
      file.mkdir();
    }
    //工具類commons-fileupload包創(chuàng)建工廠對象
    DiskFileItemFactory itemFactory=new DiskFileItemFactory();
    ServletFileUpload  upload=new ServletFileUpload(itemFactory);
    //判斷是不是傳統(tǒng)表單
    if(!ServletFileUpload.isMultipartContent(req)){
      System.out.println("是傳統(tǒng)的表單 沒有上傳功能");
      return;
    }

    try {
      //表單的各項數(shù)據(jù)對象,封裝成集合
      List<FileItem> list = upload.parseRequest(req);
      for(FileItem item:list){

        //是普通的表單數(shù)據(jù)
        if(item.isFormField()){
          String fieldName = item.getFieldName();
          String value = item.getString("utf-8");
          System.out.println(fieldName+"  "+value);
        }else {
          String filename = item.getName();//上傳的文件名字
          if(filename==null||filename.trim().equals("")){
            // 當(dāng)前上傳的文件為空
            continue;
          }
          System.out.println(filename);
          //得到文件的名字
          filename = filename.substring(filename.lastIndexOf("\\")+1);

          InputStream in = item.getInputStream();

          OutputStream out=new FileOutputStream(savepath+"\\"+filename);

          byte[] buf=new byte[1024];
          int len=0;
          while((len=in.read(buf))>0){
            out.write(buf,0,len);
          }
          in.close();
          out.close();
        }

      }
    } catch (FileUploadException e) {
      e.printStackTrace();
    }

  req.getRequestDispatcher("/downloadlist").forward(req,resp);
  }

上傳文件的大致上,是將提交的文件轉(zhuǎn)存到服務(wù)器端的一個文件目錄下。然后轉(zhuǎn)發(fā)到展示頁面供選擇。

下載文件的一些設(shè)置

@Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("utf-8");
    resp.setContentType("text/html;charset=utf-8");
    //獲取前臺文件所展示的文件名稱和存儲目錄下的名稱要一致,方便寫參數(shù)下載。
    String fileName= req.getParameter("file");

    //先獲取上傳目錄路徑
    String basePath = getServletContext().getRealPath("/upload");

    //如果文件名是中文,需要進(jìn)行url編碼,此操作是為了避免不同瀏覽器的下載頁面下文件亂碼的情況
    String agent = req.getHeader("User-Agent");
    String filenameEncoder = "";
    if (agent.contains("MSIE")) {
      // IE瀏覽器
      filenameEncoder = URLEncoder.encode(fileName, "utf-8");
      filenameEncoder = filenameEncoder.replace("+", " ");
    } else if (agent.contains("Firefox")) {
      // 火狐瀏覽器
      BASE64Encoder base64Encoder = new BASE64Encoder();
      filenameEncoder = "=?utf-8?B?"
          + base64Encoder.encode(fileName.getBytes("utf-8")) + "?=";
    } else {
      // 其它瀏覽器
      filenameEncoder = URLEncoder.encode(fileName, "utf-8");
    }


    //設(shè)置下載的響應(yīng)頭
    resp.setHeader("content-disposition", "attachment;fileName="+filenameEncoder);//此filenameEncoder必須經(jīng)過轉(zhuǎn)碼處理
    //獲取一個文件輸入流
    InputStream is = new FileInputStream(new File(basePath,fileName));
    //獲取response字節(jié)流
    OutputStream out = resp.getOutputStream();
    byte[] b= new byte[1024];
    int len =-1;
    while((len=is.read(b))!=-1){
      out.write(b,0,len);
    }
    //關(guān)閉流
    out.close();
    is.close();
  }

下載的設(shè)置上需要注意文件名的一些亂碼問題,最主要的是區(qū)別于不同瀏覽器下的一些差異。需要對文件名轉(zhuǎn)碼處理。

還需要提前設(shè)置對瀏覽器的響應(yīng)頭,告知瀏覽器是一個文件。

resp.setHeader("content-disposition", "attachment;fileName="+filenameEncoder);

接觸了springmvc模式后,對上面的上傳與下載進(jìn)行優(yōu)化,

此處上傳的功能依舊是采用表格上傳。文件格式依舊是

<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">

后臺則是

@RequestMapping("/upload")
  public String upload(MultipartFile file,String userName,HttpServletRequest request) throws IOException {
    String filename = file.getOriginalFilename();

    String suffix = filename.substring(filename.lastIndexOf("."));

    if(suffix.equalsIgnoreCase(".jpg")){
      String uuid = UUID.randomUUID().toString();
      //FileUtils.copyInputStreamToFile(file.getInputStream(),new File("E://"+uuid+suffix));

      file.transferTo(new File("D://"+System.currentTimeMillis()+suffix));//位置存儲在硬盤上
//      file.transferTo(new File(request.getServletContext().getRealPath("/")+"static/userImages/"+file));
//      存儲在項目里的目錄下
      request.setAttribute("result","上傳成功");
      return "/result.jsp";
    }else{
      request.setAttribute("result","上傳失敗");
      return "/result.jsp";
    }
  }

相比之前的傳統(tǒng)式上傳,springmvc模式下封裝了許多繁瑣的過程,通過transferTo即可實現(xiàn)一些相應(yīng)的操作

而下載也是相應(yīng)的簡化了許多

@RequestMapping("/download")
  public void download(String filename, HttpServletResponse response, HttpServletRequest request) throws IOException {
    response.setHeader("content-disposition","attachment;filename="+filename);

    ServletOutputStream outputStream = response.getOutputStream();

    String path = request.getServletContext().getRealPath("images");

    File file = new File(path,filename);

    byte[] bytes = FileUtils.readFileToByteArray(file);

    outputStream.write(bytes);

    outputStream.close();
  }

一般框架會省去許多重復(fù)性的工作,但底層的基本原理還是要清楚過程

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • RocketMQ NameServer 核心源碼解析

    RocketMQ NameServer 核心源碼解析

    這篇文章主要為大家介紹了RocketMQ NameServer 核心源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • SpringBoot配置嵌入式Servlet容器和使用外置Servlet容器的教程圖解

    SpringBoot配置嵌入式Servlet容器和使用外置Servlet容器的教程圖解

    這篇文章主要介紹了SpringBoot配置嵌入式Servlet容器和使用外置Servlet容器的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • springboot2.5.2與 flowable6.6.0整合流程引擎應(yīng)用分析

    springboot2.5.2與 flowable6.6.0整合流程引擎應(yīng)用分析

    這篇文章主要介紹了springboot2.5.2與 flowable6.6.0整合流程引擎應(yīng)用分析,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • Java中StringUtils工具類的一些用法實例

    Java中StringUtils工具類的一些用法實例

    這篇文章主要介紹了Java中StringUtils工具類的一些用法實例,本文著重講解了isEmpty和isBlank方法的使用,另外也講解了trim、strip等方法的使用實例,需要的朋友可以參考下
    2015-06-06
  • 總結(jié)一下關(guān)于在Java8中使用stream流踩過的一些坑

    總結(jié)一下關(guān)于在Java8中使用stream流踩過的一些坑

    java8新增了stream流式處理,對于list的各種操作處理提供了好多方法 ,用過的都知道,方便極了.比如篩選、排序、合并、類型轉(zhuǎn)換等等.以下是我實際工作中踩過的坑,記錄下避免大家踩坑,需要的朋友可以參考下
    2021-06-06
  • Spring boot調(diào)用Oracle存儲過程的兩種方式及完整代碼

    Spring boot調(diào)用Oracle存儲過程的兩種方式及完整代碼

    這篇文章主要給大家介紹了關(guān)于Spring boot調(diào)用Oracle存儲過程的兩種方式及完整代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • SpringAOP事務(wù)配置語法及實現(xiàn)過程詳解

    SpringAOP事務(wù)配置語法及實現(xiàn)過程詳解

    這篇文章主要介紹了SpringAOP事務(wù)配置語法及實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • java正則表達(dá)式簡單應(yīng)用

    java正則表達(dá)式簡單應(yīng)用

    這篇文章主要介紹了java正則表達(dá)式簡單應(yīng)用,在之前幾篇文章中已經(jīng)深入學(xué)習(xí)了java正則表達(dá)式基礎(chǔ)知識,本文對java正則表達(dá)式應(yīng)用進(jìn)行研究,感興趣的小伙伴們可以參考一下
    2015-12-12
  • java8 forEach結(jié)合Lambda表達(dá)式遍歷 List操作

    java8 forEach結(jié)合Lambda表達(dá)式遍歷 List操作

    這篇文章主要介紹了java8 forEach結(jié)合Lambda表達(dá)式遍歷 List操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Jenkins自動構(gòu)建部署項目到遠(yuǎn)程服務(wù)器上的方法步驟

    Jenkins自動構(gòu)建部署項目到遠(yuǎn)程服務(wù)器上的方法步驟

    這篇文章主要介紹了Jenkins自動構(gòu)建部署項目到遠(yuǎn)程服務(wù)器上的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評論

海兴县| 南木林县| 波密县| 霞浦县| 洪雅县| 永春县| 额尔古纳市| 增城市| 日喀则市| 贡嘎县| 白沙| 彩票| 湖北省| 永州市| 长沙市| 宁海县| 北川| 科技| 松江区| 嵊泗县| 南乐县| 高台县| 南开区| 宝兴县| 沙洋县| 武定县| 阿坝| 镇远县| 绥江县| 库伦旗| 咸丰县| 兰坪| 皮山县| 侯马市| 德格县| 托里县| 马龙县| 抚宁县| 宝鸡市| 马尔康县| 普格县|