热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Spring框架实现文件上传功能

这篇文章主要为大家详细介绍了Spring框架实现文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在Java中实现文件的上传有多种方式,如smartUpload或是使用Strus2,本文与大家分享使用Spring框架中的MultipartFile类来实例文件的上传。

不啰嗦了,直接上干货。先是编写了一个实现文件上传的类FileUploadingUtil,此类中定义了两个对外公开的方法,upload和getFileMap。

前者需要传入一个Map参数,是用户提交的表单中的文件列表,最终返回值的也是一个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 upload(Map files) throws IOException { 
    File file = new File(FILEDIR); 
    if (!file.exists()) { 
      file.mkdir(); 
    } 
 
    Map result = new HashMap(); 
    Iterator> 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; 
  } 
 
  /** 
   * 写入数据 
   * 
   * @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 getFileMap() { 
    logger.info(FileUploadingUtil.FILEDIR); 
    Map map = new HashMap(); 
    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; 
  } 
 
  /** 
   * 返回文件存储路径,为防止重名文件被覆盖,在文件名称中增加了随机数 
   * @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类实现文件上传之功能。

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 uploadedFiles = FileUploadingUtil.upload(mRequest.getFileMap()); 
 
      Iterator> iter = uploadedFiles.entrySet().iterator(); 
      while (iter.hasNext()) { 
        Entry 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类的错误。

依赖引用如下。

 
  commons-fileupload 
  commons-fileupload 
  1.3.1 
 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
author-avatar
手机用户2602922981
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有