SpringMVC 文件上传(单、多文件)

工程结构

SpringMVC 文件上传(单、多文件)_第1张图片
image.png

依赖jar包

需要3个文件上传的jar包


SpringMVC 文件上传(单、多文件)_第2张图片
image.png

SpringMVC 配置文件

要用SpringMVC实现文件上传功能,需要在SpringMVC配置文件中添加文件上传组件


 
    
    
    
    
    
    

    
    

    
    

    
    
        
            52428800
        
    

前端视图

相比于普通表单,需要添加 enctype=multipart/form-data 属性

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>




SpringMVC 文件上传


    



Controller

想要实现文件上传需要用到 HttpServletReqeust 对象

package com.project.action;

import java.util.List;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.project.util.FileUploadUtil;

@Controller
public class UploadAction {
    
    @RequestMapping("/upload.action")
    public void saveFile(HttpServletRequest req) {
        
        System.out.println("请求到 acton ");
        // 保存文件
        List filesname = FileUploadUtil.saveFiles(req);
        
        System.out.println(filesname);
    }
}

文件上传工具类

package com.project.util;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

public class FileUploadUtil {

    /**
     * 保存多个文件
     * @param req
     * @return 文件名的Set集合
     */
    public static List saveFiles(HttpServletRequest req) {
        
        List fileNameSet = new ArrayList();

        CommonsMultipartResolver multipartReslver = new CommonsMultipartResolver(req.getSession().getServletContext());

        // 检查 form 是否有 enctype="multipart/form-data" 属性值
        if (multipartReslver.isMultipart(req)) {
            
            // request 转换为 多部分 request
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) req;
            
            // 获取 multiRequest 中所有文件名
            Iterator iter = multiRequest.getFileNames();
            
            // 遍历所有文件
            while (iter.hasNext()) {
                MultipartFile file = multiRequest.getFile(iter.next().toString());
                
                // 检查文件是否存在,及文件是否为空
                if (file != null && !file.isEmpty()) {
                    // 保存文件
                    String filename = saveFile(req, file);
                    fileNameSet.add(filename);
                }
            }
        }
        
        return fileNameSet;
    }

    /**
     * 保存单个文件,保存成功返回文件名,否则返回null
     * 
     * @param req
     * @param file
     * @return 保存文件的名字
     */
    public static String saveFile(HttpServletRequest req, MultipartFile file) {

        String result = null;

        // 获取原始文件名
        String fileName = file.getOriginalFilename();

        // 给文件设置新名字
        String newFileName = UUID.randomUUID() + "_" + fileName;

        // 需要保存的文件路径
        ServletContext context = req.getServletContext();
        String path = context.getRealPath("/upload");

        // 检查目录是否存在
        File dir = new File(path);
        if (!dir.exists()) {
            dir.mkdirs();
        }

        // 在目录下创建文件
        File newFile = new File(path, newFileName);

        // 将上传的文件数据,写入到file对象
        try {
            file.transferTo(newFile);
            result = newFileName;
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return newFileName;
    }
}

你可能感兴趣的:(SpringMVC 文件上传(单、多文件))