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

Spring框架實現(xiàn)文件上傳功能

 更新時間:2017年11月20日 14:21:12   作者:chris_mao  
這篇文章主要為大家詳細介紹了Spring框架實現(xiàn)文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下

在Java中實現(xiàn)文件的上傳有多種方式,如smartUpload或是使用Strus2,本文與大家分享使用Spring框架中的MultipartFile類來實例文件的上傳。

不啰嗦了,直接上干貨。先是編寫了一個實現(xiàn)文件上傳的類FileUploadingUtil,此類中定義了兩個對外公開的方法,upload和getFileMap。

前者需要傳入一個Map參數(shù),是用戶提交的表單中的文件列表,最終返回值的也是一個Map類型對象,其鍵名為上傳的文件名稱,鍵值為文件在服務器上的存儲路徑;后者主要是用于測試用途,非主要功能,看官可以忽略此方法。

package com.emerson.cwms.utils; 
 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.Date; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.Map; 
import java.util.Map.Entry; 
 
import org.springframework.web.multipart.MultipartFile; 
 
/** 
 * 文件上傳工具類 
 * 
 * @author Chris Mao(Zibing) 
 * 
 */ 
public class FileUploadingUtil { 
 
  /** 
   * 服務器上的保存路徑,在使用到上傳功能的Controller中對其進行賦值 
   */ 
  public static String FILEDIR = null; 
 
  /** 
   * 上傳多個文件,返回文件名稱和服務器存儲路徑列表 
   * 
   * @param files 
   * @return 
   * @throws IOException 
   */ 
  public static Map<String, String> upload(Map<String, MultipartFile> files) throws IOException { 
    File file = new File(FILEDIR); 
    if (!file.exists()) { 
      file.mkdir(); 
    } 
 
    Map<String, String> result = new HashMap<String, String>(); 
    Iterator<Entry<String, MultipartFile>> iter = files.entrySet().iterator(); 
    while (iter.hasNext()) { 
      MultipartFile aFile = iter.next().getValue(); 
      if (aFile.getSize() != 0 && !"".equals(aFile.getName())) { 
        result.put(aFile.getOriginalFilename(), uploadFile(aFile)); 
      } 
    } 
    return result; 
  } 
 
  /** 
   * 上傳單個文件,并返回其在服務器中的存儲路徑 
   * 
   * @param aFile 
   * @return 
   * @throws FileNotFoundException 
   * @throws IOException 
   */ 
  private static String uploadFile(MultipartFile aFile) throws IOException { 
    String filePath = initFilePath(aFile.getOriginalFilename()); 
    try { 
      write(aFile.getInputStream(), new FileOutputStream(filePath)); 
    } catch (FileNotFoundException e) { 
      logger.error("上傳的文件: " + aFile.getName() + " 不存在??!"); 
      e.printStackTrace(); 
    } 
    return filePath; 
  } 
 
  /** 
   * 寫入數(shù)據(jù) 
   * 
   * @param in 
   * @param out 
   * @throws IOException 
   */ 
  private static void write(InputStream in, OutputStream out) throws IOException { 
    try { 
      byte[] buffer = new byte[1024]; 
      int bytesRead = -1; 
      while ((bytesRead = in.read(buffer)) != -1) { 
        out.write(buffer, 0, bytesRead); 
      } 
      out.flush(); 
    } finally { 
      try { 
        in.close(); 
        out.close(); 
      } catch (IOException ex) { 
      } 
    } 
  } 
 
  /** 
   * 遍歷服務器目錄,列舉出目錄中的所有文件(含子目錄) 
   * @return 
   */ 
  public static Map<String, String> getFileMap() { 
    logger.info(FileUploadingUtil.FILEDIR); 
    Map<String, String> map = new HashMap<String, String>(); 
    File[] files = new File(FileUploadingUtil.FILEDIR).listFiles(); 
    if (files != null) { 
      for (File file : files) { 
        if (file.isDirectory()) { 
          File[] files2 = file.listFiles(); 
          if (files2 != null) { 
            for (File file2 : files2) { 
              String name = file2.getName(); 
              logger.info(file2.getParentFile().getAbsolutePath()); 
              logger.info(file2.getAbsolutePath()); 
              map.put(file2.getParentFile().getName() + "/" + name, 
                  name.substring(name.lastIndexOf("_") + 1)); 
            } 
          } 
        } 
      } 
    } 
    return map; 
  } 
 
  /** 
   * 返回文件存儲路徑,為防止重名文件被覆蓋,在文件名稱中增加了隨機數(shù) 
   * @param name 
   * @return 
   */ 
  private static String initFilePath(String name) { 
    String dir = getFileDir(name) + ""; 
    File file = new File(FILEDIR + dir); 
    if (!file.exists()) { 
      file.mkdir(); 
    } 
    Long num = new Date().getTime(); 
    Double d = Math.random() * num; 
    return (file.getPath() + "/" + num + d.longValue() + "_" + name).replaceAll(" ", "-"); 
  } 
 
  /** 
   * 
   * @param name 
   * @return 
   */ 
  private static int getFileDir(String name) { 
    return name.hashCode() & 0xf; 
  } 
} 

Controller代碼,使用上述定義的FileUploadingUtil類實現(xiàn)文件上傳之功能。

package com.emerson.cwms.web;  


import java.io.IOException; 
import java.util.Iterator; 
import java.util.Map; 
import java.util.Map.Entry; 
 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.multipart.MultipartHttpServletRequest; 
 
import com.emerson.cwms.utils.FileUploadingUtil; 
 
/** 
 * 文件上傳控制器 
 * 
 * @author Chris Mao(Zibing) 
 * 
 */ 
@Controller 
@RequestMapping(value = "/files") 
public class FileController { 
   
  @RequestMapping(value = "/", method = RequestMethod.GET) 
  public String list(HttpServletRequest request, HttpServletResponse response, Model model) { 
    iniFileDir(request); 
     
    System.out.println(request.getAttribute("files")); 
    model.addAttribute("files", FileUploadingUtil.getFileMap()); 
    return "files/list"; 
  } 
   
  @RequestMapping(value = "/upload", method = RequestMethod.POST) 
  public String doUpload(HttpServletRequest request) { 
    iniFileDir(request); 
     
    try { 
      MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request; 
      Map<String, String> uploadedFiles = FileUploadingUtil.upload(mRequest.getFileMap()); 
 
      Iterator<Entry<String, String>> iter = uploadedFiles.entrySet().iterator(); 
      while (iter.hasNext()) { 
        Entry<String, String> each = iter.next(); 
        System.out.print("Uploaded File Name = " + each.getKey()); 
        System.out.println(", Saved Path in Server = " + each.getValue()); 
      } 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
    return "redirect:/files/"; 
  } 
 
  private void iniFileDir(HttpServletRequest request) { 
    FileUploadingUtil.FILEDIR = request.getSession().getServletContext().getRealPath("/") + "files/"; 
    if (FileUploadingUtil.FILEDIR == null) { 
      FileUploadingUtil.FILEDIR = request.getSession().getServletContext().getRealPath("/") + "files/"; 
    } 
  } 
} 

注意事項:一定要在pom.xml文件中添加對commons-fileupload的依賴引用,否則代碼在運行時會提示找不到FileItemFactory類的錯誤。

依賴引用如下。

<dependency> 
  <groupId>commons-fileupload</groupId> 
  <artifactId>commons-fileupload</artifactId> 
  <version>1.3.1</version> 
</dependency> 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Spring Cloud Alibaba 本地調試介紹及方案設計

    Spring Cloud Alibaba 本地調試介紹及方案設計

    為了解決 本地調試 的問題,本文實現(xiàn)了一種簡單實用的策略,可以通過 Nacos 動態(tài)配置服務路由,還可以基于用戶,部門,組織等級別配置服務路由,實現(xiàn) 本地調試 的同時,實際上也實現(xiàn) 灰度發(fā)布,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • SpringCloud Ribbon負載均衡工具使用

    SpringCloud Ribbon負載均衡工具使用

    Ribbon是Netflix的組件之一,負責注冊中心的負載均衡,有助于控制HTTP和TCP客戶端行為。Spring?Cloud?Netflix?Ribbon一般配合Ribbon進行使用,利用在Eureka中讀取的服務信息,在調用服務節(jié)點時合理進行負載
    2023-02-02
  • 深入淺析Spring-boot-starter常用依賴模塊

    深入淺析Spring-boot-starter常用依賴模塊

    這篇文章主要介紹了Spring-boot-starter常用依賴模塊及spring boot的兩大優(yōu)點,需要的朋友可以參考下
    2018-01-01
  • 詳解java代碼中init method和destroy method的三種使用方式

    詳解java代碼中init method和destroy method的三種使用方式

    這篇文章主要介紹了詳解java代碼中init method和destroy method的三種使用方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • Maven如何打入依賴中指定的部分jar包

    Maven如何打入依賴中指定的部分jar包

    當項目運行的環(huán)境里已經有一個jar包是pom文件依賴其他項目的jar包,所以最后得到的項目jar包中還需要打入其他項目的最新代碼,接下來通過本文給大家介紹Maven打入依賴jar包的操作工程,需要的朋友參考下吧
    2021-06-06
  • 一篇文章帶你認識Java8接口的默認方法

    一篇文章帶你認識Java8接口的默認方法

    這篇文章主要給大家介紹了如何通過一篇文章帶你認識Java8接口的默認方法的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java8具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • java實現(xiàn)單詞查詢小程序

    java實現(xiàn)單詞查詢小程序

    這篇文章主要為大家詳細介紹了java實現(xiàn)單詞查詢小程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Struts2動態(tài)結果集代碼示例

    Struts2動態(tài)結果集代碼示例

    這篇文章主要介紹了Struts2動態(tài)結果集的有關內容,涉及具體代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-09-09
  • java 運行報錯has been compiled by a more recent version of the Java Runtime

    java 運行報錯has been compiled by a more recent version of the J

    java 運行報錯has been compiled by a more recent version of the Java Runtime (class file version 54.0)
    2021-04-04
  • Java8中Stream的一些神操作

    Java8中Stream的一些神操作

    Stream是Java8中處理集合的關鍵抽象概念,它可以指定你希望對集合進行的操作,可以執(zhí)行非常復雜的查找、過濾和映射數(shù)據(jù)等操作,這篇文章主要給大家介紹了Java8中Stream的一些神操作,需要的朋友可以參考下
    2021-11-11

最新評論

丽江市| 新密市| 鲁山县| 宝兴县| 喀喇| 榆林市| 当阳市| 滨海县| 大冶市| 银川市| 绥化市| 永春县| 通山县| 海淀区| 临清市| 永德县| 信宜市| 咸丰县| 桐柏县| 洪江市| 铅山县| 太原市| 昆山市| 诸暨市| 永康市| 辽中县| 宁津县| 顺昌县| 东乌珠穆沁旗| 和硕县| 千阳县| 青州市| 调兵山市| 沈阳市| 江华| 阿拉善左旗| 陵水| 若尔盖县| 中阳县| 水城县| 平南县|