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

Spring MVC 文件上傳的示例代碼

 更新時(shí)間:2017年09月25日 08:34:04   作者:yuanfy008  
本篇文章主要介紹了Spring MVC 文件上傳的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

一如既往記錄下常用而又容易忘記的東西,本篇博文主要針對(duì)Spring MVC是如何上傳文件的。以下記錄兩種上傳方法并針對(duì)案例進(jìn)行記錄。(有關(guān)spring mvc其他配置省略)

1、使用Spring MVC 上傳文件必須配置文件解析器,如下:

<!-- 上傳文件攔截,設(shè)置最大上傳文件大小 10M=10*1024*1024(B)=10485760 bytes --> 
 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
  <property name="maxUploadSize" value="10485760" /> 
  <property name="maxInMemorySize" value="10240000" /> 
  <property name="defaultEncoding" value="UTF-8" />
 </bean>

2、建立上傳文件表單代碼,其中要注意form表單中的enctype 屬性,必須存在且必須為multipart/form-data。還有當(dāng)form中存在button標(biāo)簽時(shí),用ajax異步提交表單后,也面會(huì)被刷新。原因:button 存在時(shí)會(huì)再次提交一下表單,所以頁(yè)面被刷新了。

<!-- 
  enctype 屬性值:
    1、application/x-www-form-urlencoded 在發(fā)送前編碼所有字符(默認(rèn))
    2、multipart/form-data 不對(duì)字符編碼。 在使用包含文件上傳控件的表單時(shí),必須使用該值。
    3、text/plain 空格轉(zhuǎn)換為 "+" 加號(hào),但不對(duì)特殊字符編碼。
-->
<div class="row">
  <form method="post" enctype="multipart/form-data" id="form1">
    <div><label>1、采用流的方式</label></div>
    <div class="col-sm-7" style="padding-left:0px">
      <div class="input-group">
        <input type="text" class="form-control" id="showFileInput1">
        <input type="file" style="display:none" name="txtFile" id="uploadFileInput1" accept="text/plain">
        <span class="input-group-addon" id="uploadFileButton1">
          <span class="glyphicon glyphicon-folder-open"></span>
          <label>瀏覽</label>
        </span>
      </div>
    </div>
    <div class="col-sm-5">
      <!-- 
                  當(dāng)form中存在button標(biāo)簽時(shí),用ajax異步提交表單后,也面會(huì)被刷新。(感覺(jué)很詭異)
                  原因:button 存在時(shí)會(huì)再次提交一下表單,所以頁(yè)面被刷新了。(之前認(rèn)為button type='submit' 時(shí))button才有提交表單的功能。
      -->
      <a class="btn btn-default" id="submit1">上傳</a>
    </div>
  </form>
</div>

 3.1、使用CommonsMultipartFile接收上傳文件,其中要注意的是:方法中CommonsMultipartFile對(duì)應(yīng)的變量名如果不是對(duì)應(yīng)表單中文件輸入框<input type="file" style="display:none" name="txtFile" id="uploadFileInput1" accept="text/plain">的名稱就必須加上@RequestParam("txtFile") 強(qiáng)制注入。

 /**
   * @Description: 通過(guò)文件流的形式上傳
   * @param file  @RequestParam("txtFile") 將name=txtFile控件得到的文件封裝成CommonsMultipartFile對(duì)象,
   *       如果不這樣做會(huì)報(bào)CommonsMultipartFile沒(méi)有初始化的錯(cuò)誤
   *       java.lang.NoSuchMethodException: org.springframework.web.multipart.commons.CommonsMultipartFile.<init>()
   * @return
   * @author yuanfy
   * @date 2017年9月15日 下午4:36:11 
   * @version 6.5
   */
  @RequestMapping(value="test/upload1")
  @ResponseBody
  public String testUpload1(@RequestParam("txtFile")CommonsMultipartFile file){
    Long times = System.currentTimeMillis();
    if (file == null) {
      return null;
    }
    StringBuilder fileContent = new StringBuilder();
    //1、獲取文件信息
    FileUtils.getFileInfo(file, fileContent);
    
    //2、上傳文件并獲取文件內(nèi)容
    try {
      file.transferTo(new File("F:\\text.log"));//另存文件
      fileContent.append(FileUtils.getFileContentByLine(file.getInputStream()));
    }
    catch (IOException e) {
      return "獲取文件內(nèi)容失敗";
    }
    
    //3、返回文件信息和內(nèi)容
    String content = fileContent.toString();
    content = content.replace("times", (System.currentTimeMillis()-times) + "ms");
    return content;
  }

  界面效果圖如下:

3.2、使用CommonsMultipartResolver獲取存放文件對(duì)象,拿到文件對(duì)象后遍歷每個(gè)文件上傳及獲取相關(guān)的內(nèi)容。

@RequestMapping(value="test/upload2")
  @ResponseBody
  public String testUpload2(HttpServletRequest request){
    Long times = System.currentTimeMillis();
    StringBuilder fileContent = new StringBuilder();
    //1.根據(jù)servletContext獲取多文件上傳解析組件
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
    if (!multipartResolver.isMultipart(request)) {
      return "不是上傳文件表單,請(qǐng)檢查表單屬性";
    }
    //2.將請(qǐng)求對(duì)象轉(zhuǎn)換為多文件請(qǐng)求對(duì)象。
    MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
    //3、根據(jù)多文件請(qǐng)求對(duì)象獲取文件存放Map
    Map<String, MultipartFile> fileMap = multipartHttpServletRequest.getFileMap();
    Iterator<Entry<String, MultipartFile>> iterator = fileMap.entrySet().iterator();
    //4、迭代文件Map,獲取具體的MultipartFile
    while (iterator.hasNext()) {
      Entry<String, MultipartFile> entry = iterator.next();
      MultipartFile multipartFile = entry.getValue();
      //獲取文件頭信息
      FileUtils.getFileInfo(multipartFile, fileContent);
      try {
        //上傳文件
        multipartFile.transferTo(new File("F:\\text.log"));
        //獲取文件內(nèi)容
        fileContent.append(FileUtils.getFileContentByLine(multipartFile.getInputStream()));
      }catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
    //5、返回文件信息和內(nèi)容
    String content = fileContent.toString();
    content = content.replace("times", (System.currentTimeMillis()-times) + "ms");
    return content;
  }

其中第一步獲取文件解析器對(duì)象應(yīng)該都清楚只要在容器中配置了對(duì)應(yīng)的對(duì)象我們就可以獲取到它,而它有根據(jù)上下文獲取的構(gòu)造函數(shù)就方便多了。

/**
   * Constructor for standalone usage. Determines the servlet container's
   * temporary directory via the given ServletContext.
   * @param servletContext the ServletContext to use
   */
  public CommonsMultipartResolver(ServletContext servletContext) {
    this();
    setServletContext(servletContext);
  }

然后根據(jù)request判斷是否還有上傳文件的表單,如果不是肯定直接返回,我們看看源碼中是怎么判斷的。

//CommonsMultipartResolver.class 主要判斷request是否為空
@Override
public boolean isMultipart(HttpServletRequest request) {
  return (request != null && ServletFileUpload.isMultipartContent(request));
}  
//ServletFileUpload 主要判斷是否是post方法,因?yàn)樯蟼魑募仨毷莗ost提交,其實(shí)我們可以在我們自定義controller中的方法指定訪問(wèn)
public static final boolean isMultipartContent(HttpServletRequest request) {
  if (!POST_METHOD.equalsIgnoreCase(request.getMethod())) {
      return false;
    }
    return FileUploadBase.isMultipartContent(new ServletRequestContext(request));
}
//FileUploadBase.class 如果請(qǐng)求是MULTIPART 則返回true
public static final boolean isMultipartContent(RequestContext ctx) {
    String contentType = ctx.getContentType();//類似:multipart/form-data; boundary=----WebKitFormBoundaryLF3eM94lDB0ocQxT
    if (contentType == null) {
      return false;
    }
    if (contentType.toLowerCase(Locale.ENGLISH).startsWith(MULTIPART)) {
      return true;
    }
    return false;
}

所以如果request是上傳文件的請(qǐng)求對(duì)象,則進(jìn)行第二步。將request轉(zhuǎn)換成多文件請(qǐng)求對(duì)象,然后獲取存放文件的map。

可想而知這種方法效率是比第一種要低的,因?yàn)樗闅v文件map,但是在Spring MVC常用的卻是這種方法。

效果圖如下:

其中FileUtils.java代碼如下:

package com.yuanfy.monitorsite.common.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import org.springframework.web.multipart.MultipartFile;

/**
 * @Description: 文件工具類方法
 * @author yuanfy
 * @date 2017年9月15日 下午2:45:40 
 * @version 1.0
 */
public class FileUtils {
  /**
   * @Description: 獲取文件信息
   * @param file CommonsMultipartFile類型的文件
   * @param fileContent StringBuilder,封裝文件信息
   * @author yuanfy
   * @date 2017年9月15日 下午2:51:34 
   * @version 1.0
   */
  public static void getFileInfo(MultipartFile file, StringBuilder fileContent) {
    fileContent.append("文件名稱:\t\t").append(file.getName()).append("\n")
      .append("文件原始名稱:\t").append(file.getOriginalFilename()).append("\n")
      .append("文件大?。篭t\t").append(file.getSize()).append("\n")
      .append("文件類型:\t\t").append(file.getContentType()).append("\n")
      .append("讀取文件時(shí)長(zhǎng):\t times").append("\n");
  }
  
  /**
   * @Description: 根據(jù)文件對(duì)象獲取文件內(nèi)容
   * @param file
   * @author yuanfy
   * @date 2017年9月15日 下午5:01:57 
   * @version 1.0
   * @throws IOException 
   * @throws FileNotFoundException 
   */
  public static String getFileContentByLine(File file) throws FileNotFoundException, IOException {
    return getFileContentByLine(new FileInputStream(file));
  }
  /**
   * @Description: 根據(jù)文件輸入流對(duì)象獲取文件內(nèi)容
   * @param in 文件輸入流對(duì)象
   * @author yuanfy
   * @date 2017年9月15日 下午5:01:57 
   * @version 1.0
   * @throws IOException 
   */
  public static String getFileContentByLine(InputStream in) throws IOException {
    StringBuilder fileContent = new StringBuilder();
    
    byte[] bytes = new byte[1024];
    int len = 0;
    while ((len = in.read(bytes)) != -1) {
      String content = new String(bytes, 0, len, "UTF-8");
      fileContent.append(content);
    }
    StreamUtils.close(in);
    return fileContent.toString();
  }
}

當(dāng)然要想查看整個(gè)代碼,可以訪問(wèn)我項(xiàng)目的整個(gè)代碼:https://github.com/YuanFY/blog_demo。

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

相關(guān)文章

  • 全面解釋java中StringBuilder、StringBuffer、String類之間的關(guān)系

    全面解釋java中StringBuilder、StringBuffer、String類之間的關(guān)系

    String的值是不可變的,這就導(dǎo)致每次對(duì)String的操作都會(huì)生成新的String對(duì)象,不僅效率低下,而且大量浪費(fèi)有限的內(nèi)存空間,StringBuffer是可變類,和線程安全的字符串操作類,任何對(duì)它指向的字符串的操作都不會(huì)產(chǎn)生新的對(duì)象,StringBuffer和StringBuilder類功能基本相似
    2013-01-01
  • Spring boot實(shí)現(xiàn)上傳文件到本地服務(wù)器

    Spring boot實(shí)現(xiàn)上傳文件到本地服務(wù)器

    這篇文章主要為大家詳細(xì)介紹了Spring boot實(shí)現(xiàn)上傳文件到本地服務(wù)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • SpringAOP四種通知類型+環(huán)繞通知說(shuō)明

    SpringAOP四種通知類型+環(huán)繞通知說(shuō)明

    這篇文章主要介紹了SpringAOP四種通知類型+環(huán)繞通知說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • C語(yǔ)言中下標(biāo)與指針的轉(zhuǎn)換以及指向指針的指針的例子

    C語(yǔ)言中下標(biāo)與指針的轉(zhuǎn)換以及指向指針的指針的例子

    這篇文章主要介紹了C語(yǔ)言中下標(biāo)與指針的轉(zhuǎn)換以及指向指針的指針的示例,是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-11-11
  • 通過(guò)Spring Security魔幻山谷講解獲取認(rèn)證機(jī)制核心原理

    通過(guò)Spring Security魔幻山谷講解獲取認(rèn)證機(jī)制核心原理

    這篇文章主要介紹了通過(guò)Spring Security魔幻山谷講解獲取認(rèn)證機(jī)制核心原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java使用Hutool+自定義注解實(shí)現(xiàn)數(shù)據(jù)脫敏

    Java使用Hutool+自定義注解實(shí)現(xiàn)數(shù)據(jù)脫敏

    我們?cè)谑褂檬謾C(jī)銀行的時(shí)候經(jīng)常能看到APP上會(huì)將銀行卡的卡號(hào)中間部分給隱藏掉使用 ***** 來(lái)代替,在某些網(wǎng)站上查看一些業(yè)務(wù)密碼時(shí)(例如簽到密碼等)也會(huì)使用 ***** 來(lái)隱藏掉真正的密碼,那么這種方式是如何實(shí)現(xiàn)的呢,本文將給大家介紹使用Hutool+自定義注解實(shí)現(xiàn)數(shù)據(jù)脫敏
    2023-09-09
  • Java使用poi獲取不到docx表格中書(shū)簽的問(wèn)題及解決

    Java使用poi獲取不到docx表格中書(shū)簽的問(wèn)題及解決

    這篇文章主要介紹了Java使用poi獲取不到docx表格中書(shū)簽的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 淺談JAVA設(shè)計(jì)模式之代理模式

    淺談JAVA設(shè)計(jì)模式之代理模式

    這篇文章主要介紹了JAVA設(shè)計(jì)模式之代理模式的的相關(guān)資料,文中代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Springboot 整合 Java DL4J 實(shí)現(xiàn)時(shí)尚穿搭推薦系統(tǒng)(實(shí)例代碼)

    Springboot 整合 Java DL4J 實(shí)現(xiàn)時(shí)尚穿搭推薦系統(tǒng)(實(shí)例代碼)

    本文介紹了如何使用SpringBoot和JavaDeeplearning4j框架搭建一個(gè)時(shí)尚穿搭推薦系統(tǒng),文章詳細(xì)闡述了系統(tǒng)的技術(shù)架構(gòu)、數(shù)據(jù)集格式、Maven依賴配置、模型訓(xùn)練和預(yù)測(cè)代碼實(shí)現(xiàn),以及單元測(cè)試和預(yù)期輸出結(jié)果
    2024-10-10
  • 詳解Mybatis的緩存

    詳解Mybatis的緩存

    這篇文章主要介紹了Mybatis緩存的相關(guān)資料,幫助大家更好的理解和使用Mybatis框架,感興趣的朋友可以了解下
    2021-01-01

最新評(píng)論

家居| 佳木斯市| 遵义县| 祁门县| 兰州市| 宁蒗| 丰宁| 黑河市| 仁化县| 琼中| 万荣县| 遂昌县| 邢台市| 和龙市| 竹山县| 河池市| 宁远县| 平武县| 景泰县| 仁布县| 建水县| 大方县| 潜江市| 武隆县| 随州市| 闵行区| 太仆寺旗| 巴林右旗| 塘沽区| 梅州市| 枣阳市| 阿克| 普格县| 海门市| 藁城市| 湛江市| 利辛县| 加查县| 万载县| 朝阳市| 长寿区|