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

相關文章
相關標籤/搜索