真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

利用SpringMVC如何實(shí)現(xiàn)一個(gè)文件上傳下載功能

這篇文章給大家介紹利用SpringMVC如何實(shí)現(xiàn)一個(gè)文件上傳下載功能,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

專業(yè)成都網(wǎng)站建設(shè)公司,做排名好的好網(wǎng)站,排在同行前面,為您帶來(lái)客戶和效益!創(chuàng)新互聯(lián)為您提供成都網(wǎng)站建設(shè),五站合一網(wǎng)站設(shè)計(jì)制作,服務(wù)好的網(wǎng)站設(shè)計(jì)公司,成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)負(fù)責(zé)任的成都網(wǎng)站制作公司!

成都創(chuàng)新互聯(lián)公司是一家專注于成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),凌海網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:凌海等地區(qū)。凌海做網(wǎng)站價(jià)格咨詢:13518219792

文件上傳

文件上傳是項(xiàng)目開發(fā)中最常見的功能。為了能上傳文件,必須將表單的method設(shè)置為POST,并將enctype設(shè)置為multipart/form-data。只有在這樣的情況下,瀏覽器才會(huì)把用戶選擇的文件以二進(jìn)制數(shù)據(jù)發(fā)送給服務(wù)器。

一旦設(shè)置了enctype為multipart/form-data,瀏覽器即會(huì)采用二進(jìn)制流的方式來(lái)處理表單數(shù)據(jù),而對(duì)于文件上傳的處理則涉及在服務(wù)器端解析原始的HTTP響應(yīng)。在2003年,Apache Software Foundation發(fā)布了開源的Commons FileUpload組件,其很快成為Servlet/JSP程序員上傳文件的最佳選擇。

Servlet3.0規(guī)范已經(jīng)提供方法來(lái)處理文件上傳,但這種上傳需要在Servlet中完成。而SpringMVC則提供了更簡(jiǎn)單的封裝。
SpringMVC為文件上傳提供了直接的支持,這種支持是用即插即用的MultipartResolver實(shí)現(xiàn)的。SpringMVC使用Apache Commons FileUpload技術(shù)實(shí)現(xiàn)了一個(gè)MultipartResolver實(shí)現(xiàn)類:CommonsMultipartResolver。因此,SpringMVC的文件上傳還需要依賴Apache Commons FileUpload的組件。

本項(xiàng)目作為測(cè)試案例,在此我就不創(chuàng)建Maven項(xiàng)目了,我直接創(chuàng)建的是一個(gè)Dynamic Web Project(動(dòng)態(tài)的web項(xiàng)目),采用Tomcat 8作為web服務(wù)器,我們需要在項(xiàng)目中引入以下jar包,如下圖:

利用SpringMVC如何實(shí)現(xiàn)一個(gè)文件上傳下載功能

下面我們?cè)赪ebContent/WEB-INF下創(chuàng)建一個(gè)content文件夾,用于放文件的上傳、下載等jsp文件,下面我們創(chuàng)建uploadForm.jsp文件,演示SpringMVC的文件上傳:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>




文件上傳


  

文件上傳

文件描述:
請(qǐng)選擇文件:

負(fù)責(zé)上傳文件的表單和一般表單有一些區(qū)別,負(fù)責(zé)上傳文件的表單的編碼類型必須是“multipart/form-data”。

我們?cè)賡rc下創(chuàng)建一個(gè)包“cn.edu.jseti.controller”,然后創(chuàng)建一個(gè)FileUploadController類,用于實(shí)現(xiàn)文件的上傳和下載功能。以下是負(fù)責(zé)上傳文件的表單功能代碼:

//上傳文件會(huì)自動(dòng)綁定到MultipartFile中
   @RequestMapping(value="/upload",method=RequestMethod.POST)
   public String upload(HttpServletRequest request,
      @RequestParam("description") String description,
      @RequestParam("file") MultipartFile file) throws Exception {

    System.out.println(description);
    //如果文件不為空,寫入上傳路徑
    if(!file.isEmpty()) {
      //上傳文件路徑
      String path = request.getServletContext().getRealPath("/images/");
      //上傳文件名
      String filename = file.getOriginalFilename();
      File filepath = new File(path,filename);
      //判斷路徑是否存在,如果不存在就創(chuàng)建一個(gè)
      if (!filepath.getParentFile().exists()) { 
        filepath.getParentFile().mkdirs();
      }
      //將上傳文件保存到一個(gè)目標(biāo)文件當(dāng)中
      file.transferTo(new File(path + File.separator + filename));
      return "success";
    } else {
      return "error";
    }

   }

SpringMVC會(huì)將上傳的文件綁定到MultipartFile對(duì)象中。MultipartFile提供了獲取上傳文件內(nèi)容、文件名等方法。通過(guò)transferTo()方法還可以將文件存儲(chǔ)到硬件中,MultipartFile對(duì)象中的常用方法如下:

  1. byte[] getBytes():獲取文件數(shù)據(jù)
  2. String getContentType[]:獲取文件MIME類型,如image/jpeg等
  3. InputStream getInputStream():獲取文件流
  4. String getName():獲取表單中文件組件的名字
  5. String getOriginalFilename():獲取上傳文件的原名
  6. Long getSize():獲取文件的字節(jié)大小,單位為byte
  7. boolean isEmpty():是否有上傳文件
  8. void transferTo(File dest):將上傳文件保存到一個(gè)目錄文件中
     

SpringMVC上下文中默認(rèn)沒有裝配MultipartResolver,因此默認(rèn)情況下其不能處理文件上傳工作。如果想使用spring的文件上傳功能,則需要在上下文中配置MultipartResolver。在springmvc-config.xml進(jìn)行配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>


  
  

  
    
    
    
      /WEB-INF/content/
    
    
    
      .jsp
    
  

   
    
     
      10485760 
     
    
    
      UTF-8
    
  

部署FileUpload這個(gè)Web應(yīng)用,在瀏覽器中輸入如下URL來(lái)測(cè)試應(yīng)用: http://localhost:8088/FileUpload/uploadForm

輸入文件描述信息并選擇上傳文件,如下圖:

利用SpringMVC如何實(shí)現(xiàn)一個(gè)文件上傳下載功能 

點(diǎn)上傳按鈕,這是已將上傳的文件通過(guò)二進(jìn)制保存到web服務(wù)器上去了,如下圖:

利用SpringMVC如何實(shí)現(xiàn)一個(gè)文件上傳下載功能

使用對(duì)象接收上傳文件

上面我們通過(guò)案例演示了SpringMVC上傳文件,接下來(lái),我們演示使用對(duì)象接收上傳文件。

在實(shí)際項(xiàng)目的開發(fā)中,很多時(shí)候上傳的文件會(huì)作為對(duì)象的屬性被保存。SpringMVC的處理也非常的簡(jiǎn)單。

下面我們?cè)赾ontent文件夾創(chuàng)建registerForm.jsp文件,演示接收文件上傳:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>




用戶注冊(cè)


  

用戶注冊(cè)

用戶名:
請(qǐng)上傳頭像:

我們?cè)趕rc下面創(chuàng)建一個(gè)名叫“cn.edu.jseti.domain”包,然后再創(chuàng)建一個(gè)User類,必須要實(shí)現(xiàn)序列化接口,如下案例代碼:

package cn.edu.jseti.domain;
import java.io.Serializable;

import org.springframework.web.multipart.MultipartFile;

/**
 * 博客:http://blog.csdn.net/qian_ch
 * @author Cody
 * @version V1.0 
 */

//域?qū)ο螅瑢?shí)現(xiàn)序列化接口
public class User implements Serializable{

  private String username;
  private MultipartFile image;

  public User() {
    super();
  }

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  public MultipartFile getImage() {
    return image;
  }

  public void setImage(MultipartFile image) {
    this.image = image;
  }  

}

我們?cè)趧偛艅?chuàng)建的FileUploadController類繼續(xù)寫用于接收文件的上傳和下載功能。以下是負(fù)責(zé)接收文件的表單功能代碼:

   @RequestMapping(value="/register")
   public String register(HttpServletRequest request,
       @ModelAttribute User user,
       Model model) throws Exception {
    System.out.println(user.getUsername());
    //如果文件不為空,寫入上傳路徑
    if(!user.getImage().isEmpty()) {
      //上傳文件路徑
      String path = request.getServletContext().getRealPath("/images/");
      //上傳文件名
      String filename = user.getImage().getOriginalFilename();
      File filepath = new File(path,filename);
      //判斷路徑是否存在,如果不存在就創(chuàng)建一個(gè)
      if (!filepath.getParentFile().exists()) { 
        filepath.getParentFile().mkdirs();
      }
      //將上傳文件保存到一個(gè)目標(biāo)文件當(dāng)中
      user.getImage().transferTo(new File(path + File.separator + filename));
      //將用戶添加到model
      model.addAttribute("user", user);
      return "userInfo";
    } else {
      return "error";
    }
  }

在content文件夾下創(chuàng)建userInfo.jsp文件,該頁(yè)面主要是文件的下載頁(yè)面,如下jsp代碼:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>




文件下載


文件下載

${requestScope.user.image.originalFilename }

在瀏覽器中輸入如下URL來(lái)測(cè)試應(yīng)用: http://localhost:8088/FileUpload/registerForm

輸入用戶名并上傳剛才上傳的文件。如下圖:

利用SpringMVC如何實(shí)現(xiàn)一個(gè)文件上傳下載功能 

單擊“注冊(cè)”按鈕上傳文件,然后就會(huì)跳轉(zhuǎn)到下載頁(yè)面。如下圖:

利用SpringMVC如何實(shí)現(xiàn)一個(gè)文件上傳下載功能

文件下載

上面我們通過(guò)案例演示了使用對(duì)象接收上傳文件,接下來(lái),我們演示SpringMVC的下載文件。

文件下載比較簡(jiǎn)單,直接在頁(yè)面給出了一個(gè)超鏈接,該鏈接href的屬性等于要下載文件的文件名,就可以實(shí)現(xiàn)文件下載了。但是如果該文件的文件名為中文文件名,在某些早起的瀏覽器上就會(huì)導(dǎo)致下載失?。蝗绻褂米钚碌腇irefox、Chrome、Opera、Safari則都可以正常下載文件名為中文的文件了。

SpringMVC提供了一個(gè)ResponseEntity類型,使用它可以很方便地定義返回的HttpHeaders和HttpStatus。以下代碼演示文件的下載功能:

@RequestMapping(value="/download")
   public ResponseEntity download(HttpServletRequest request,
       @RequestParam("filename") String filename,
       Model model)throws Exception {
    //下載文件路徑
    String path = request.getServletContext().getRealPath("/images/");
    File file = new File(path + File.separator + filename);
    HttpHeaders headers = new HttpHeaders(); 
    //下載顯示的文件名,解決中文名稱亂碼問(wèn)題 
    String downloadFielName = new String(filename.getBytes("UTF-8"),"iso-8859-1");
    //通知瀏覽器以attachment(下載方式)打開圖片
    headers.setContentDispositionFormData("attachment", downloadFielName); 
    //application/octet-stream : 二進(jìn)制流數(shù)據(jù)(最常見的文件下載)。
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    return new ResponseEntity(FileUtils.readFileToByteArray(file),  
        headers, HttpStatus.CREATED); 
   }

download處理方法接收頁(yè)面?zhèn)鬟f的文件名filename后,使用Apache Commons FileUpload組件的FileUtils讀取項(xiàng)目的上傳文件,并將其構(gòu)建成ResponseEntity對(duì)象返回客戶端下載。

使用ResponseEntity對(duì)象,可以很方便的定義返回的HttpHeaders和HttpStatus。上面代碼中的MediaType,代表的是Internet Media Type,即互聯(lián)網(wǎng)媒體類型,也叫做MIME類型。在Http協(xié)議消息頭中,使用Content-Type來(lái)表示具體請(qǐng)求中的媒體類型信息。HttpStatus類型代表的是Http協(xié)議中的狀態(tài)。有關(guān)MediaType和HttpStatus類可以參考SpringMVC的API文檔。

點(diǎn)擊下載頁(yè)面的超鏈接,顯示文件正在下載,如下圖所示:

利用SpringMVC如何實(shí)現(xiàn)一個(gè)文件上傳下載功能

單擊“瀏覽”按鈕,可以選擇下載文件的保存路徑,然后單擊“確定”按鈕,文件就會(huì)順利的下載并保存。

本文中的一些功能案例代碼和配置文件不是很完整,下面附上完整代碼:

FileUploadController類完整的代碼如下:

package cn.edu.jseti.controller;

import java.io.File;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.io.FileUtils;
import cn.edu.jseti.domain.User;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
/**
 * @author Cody
 * @version V1.0 
 */
@Controller
public class FileUploadController {
  @RequestMapping(value="/{formName}")
   public String loginForm(@PathVariable String formName) {
    // 動(dòng)態(tài)跳轉(zhuǎn)頁(yè)面
    return formName;
  }

  //上傳文件會(huì)自動(dòng)綁定到MultipartFile中
   @RequestMapping(value="/upload",method=RequestMethod.POST)
   public String upload(HttpServletRequest request,
      @RequestParam("description") String description,
      @RequestParam("file") MultipartFile file) throws Exception {

    System.out.println(description);
    //如果文件不為空,寫入上傳路徑
    if(!file.isEmpty()) {
      //上傳文件路徑
      String path = request.getServletContext().getRealPath("/images/");
      //上傳文件名
      String filename = file.getOriginalFilename();
      File filepath = new File(path,filename);
      //判斷路徑是否存在,如果不存在就創(chuàng)建一個(gè)
      if (!filepath.getParentFile().exists()) { 
        filepath.getParentFile().mkdirs();
      }
      //將上傳文件保存到一個(gè)目標(biāo)文件當(dāng)中
      file.transferTo(new File(path + File.separator + filename));
      return "success";
    } else {
      return "error";
    }

   }

   @RequestMapping(value="/register")
   public String register(HttpServletRequest request,
       @ModelAttribute User user,
       Model model) throws Exception {
    System.out.println(user.getUsername());
    //如果文件不為空,寫入上傳路徑
    if(!user.getImage().isEmpty()) {
      //上傳文件路徑
      String path = request.getServletContext().getRealPath("/images/");
      //上傳文件名
      String filename = user.getImage().getOriginalFilename();
      File filepath = new File(path,filename);
      //判斷路徑是否存在,如果不存在就創(chuàng)建一個(gè)
      if (!filepath.getParentFile().exists()) { 
        filepath.getParentFile().mkdirs();
      }
      //將上傳文件保存到一個(gè)目標(biāo)文件當(dāng)中
      user.getImage().transferTo(new File(path + File.separator + filename));
      //將用戶添加到model
      model.addAttribute("user", user);
      return "userInfo";
    } else {
      return "error";
    }
  }

   @RequestMapping(value="/download")
   public ResponseEntity download(HttpServletRequest request,
       @RequestParam("filename") String filename,
       Model model)throws Exception {
    //下載文件路徑
    String path = request.getServletContext().getRealPath("/images/");
    File file = new File(path + File.separator + filename);
    HttpHeaders headers = new HttpHeaders(); 
    //下載顯示的文件名,解決中文名稱亂碼問(wèn)題 
    String downloadFielName = new String(filename.getBytes("UTF-8"),"iso-8859-1");
    //通知瀏覽器以attachment(下載方式)打開圖片
    headers.setContentDispositionFormData("attachment", downloadFielName); 
    //application/octet-stream : 二進(jìn)制流數(shù)據(jù)(最常見的文件下載)。
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    return new ResponseEntity(FileUtils.readFileToByteArray(file),  
        headers, HttpStatus.CREATED); 
   }

}

文件上傳成功的jsp代碼:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>




測(cè)試文件上傳


  恭喜,您的上傳文件成功!

文件上傳失敗的jsp代碼:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>




測(cè)試文件上傳


  上傳文件失敗!

web.xml的配置文件:

<?xml version="1.0" encoding="UTF-8"?>

 MultipartFileTest

 
 
  springmvc
  
    org.springframework.web.servlet.DispatcherServlet
  
  
   contextConfigLocation
   /WEB-INF/springmvc-config.xml
  
  1
 

 
 
  springmvc
  /
 

 
 
    characterEncodingFilter
    org.springframework.web.filter.CharacterEncodingFilter
    
      encoding
      UTF-8
    
 
  
    characterEncodingFilter
    /*
  

關(guān)于利用SpringMVC如何實(shí)現(xiàn)一個(gè)文件上傳下載功能就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。


網(wǎng)站標(biāo)題:利用SpringMVC如何實(shí)現(xiàn)一個(gè)文件上傳下載功能
文章出自:http://weahome.cn/article/igcphj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部