Spring文件上传

Spring文件上传

  • 一、所需依赖包:commons-fileupload-1.3.1.jar

  • 二、Maven配置文件pom.xml文件中加入依赖Jar包
<dependency>
	    <groupId>commons-fileupload</groupId>
	    <artifactId>commons-fileupload</artifactId>
	    <version>1.3.1</version>
	</dependency>

  • 三、在spring的配置文件spring-mvc.xml中加入类型解析器
<!-- 上传定义 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 100000 btyes -->
        <property name="maxUploadSize" value="20971520"/>
	</bean>
若是没有配置multipartResolver,将会报:
java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured?

  • 四、文件上传接口
@Controller
@Api(value = "FileUploadController", description = "文件上传控制器")
public class FileUploadController {

    /**
     *  文件上传接口方法
     * @param multipartFiles 文件
     * @param fileType 文件类型
     * @param request 请求
     * @param response 响应
     * @return Map
     */
    @ResponseBody
    @ApiOperation(value = "文件上传接口", httpMethod = "POST")
    @RequestMapping(value = "/common/uploadfile", method = RequestMethod.POST)
    public ResponseData uploadFile(@RequestParam("file") MultipartFile[] multipartFiles, @RequestParam(required = false) String fileType, HttpServletRequest request, HttpServletResponse response) {
        /*
         * 1.若是只是上传一个文件,则只须要MultipartFile类型接收文件便可,并且无需显式指定@RequestParam注解
         * 2.若是想上传多个文件,那么这里就要用MultipartFile[]类型来接收文件,而且还要指定@RequestParam注解
         * 3.上传多个文件时,前台页面中的全部<input type="file"/>的name都应该是multipartFiles,不然参数里的multipartFiles没法获取到全部上传的文件
         * 4.多种格式文件上传,日期分文件夹,资质文件放到特定文件夹
         */
        //记录上传过程信息,返回前台
        List<FileUploadEntity> list = new ArrayList<>();

        String dirName ;
        // 上传文件保存的路径
        if("qualification".equals(fileType)){
            // 资质文件存放到特定文件夹
            dirName = "qualification";
        } else {
            // 其余格式文件存放到日期命名文件夹
            dirName = DateUtil.newDateString("yyyy-MM-dd");
        }
        /*
         * 判断是否存在文件夹
         */
        //若是用的是Tomcat服务器,则文件会上传到{服务发布位置}/upload/文件夹下
        String realPath = request.getSession().getServletContext().getRealPath("/upload/" + dirName);
        File realPathDir = new File(realPath);
        if(!realPathDir.isDirectory() && !realPathDir.exists()){
            realPathDir .mkdirs();
        }
        /*
         * 多文件循环遍历上传
         */
        for (MultipartFile multipartFile : multipartFiles) {
            //记录上传过程信息,返回前台
            FileUploadEntity fileUploadEntity = new FileUploadEntity();
            if (!multipartFile.isEmpty()) {
                // 惟一化文件名
                String newFileName = UUID.randomUUID().toString().replaceAll("-", "");
                // 获取源文件拓展名
                String fileExtensionName = FileUtil.getFileExtensionName(multipartFile.getOriginalFilename());
                // 拼接拓展名
                newFileName = StringUtils.isNotEmpty(fileExtensionName) ? newFileName + "." + fileExtensionName : multipartFile.getOriginalFilename();
                // 文件相对路径
                String relativePath = "/upload/" + dirName + "/" + newFileName;
                fileUploadEntity.setCode(200);
                fileUploadEntity.setFileName(multipartFile.getOriginalFilename());
                fileUploadEntity.setFilePath(relativePath);
                fileUploadEntity.setUploadDate(DateUtil.newDateString(DateUtil.TIME_FORMAT_FULL));
                try {
                    //这里没必要处理IO流关闭的问题,由于FileUtils.copyInputStreamToFile()方法内部会自动把用到的IO流关掉
                    //FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), new File(realPath, multipartFile.getOriginalFilename()));
                    //这里没必要处理IO流关闭的问题,由于transferTo方法的实现中会自动关闭IO流
                    multipartFile.transferTo(new File(realPath, newFileName));
                } catch (IOException e) {
                    e.printStackTrace();
                    fileUploadEntity.setCode(500);
                }
                list.add(fileUploadEntity);
            }
        }
        return ResponseData.ok(list);
    }
}

注意:@RequestParam("file")这里必须加入value值,不然多文件时接收不到java

相关文章
相关标签/搜索