SpringMVC上传文件

1,386 阅读3分钟

传统文件的上传

所谓的传统文件上传,是指我们上传的文件和访问的应用都存在于同一台服务器上。

实现步骤

上传页面

<form action="User/fileUpload" method="post" enctype="multipart/form-data">
        选择文件:<input type="file" name="upload"><br>
        <input type="submit" value="确认上传">
</form>

控制层类:

@RequestMapping("/User")
@Controller
public class UserController {
    @RequestMapping("/fileUpload")   //此处MultipartFile类对象名必须和index.jsp中的name值相同
    public String fileUpload(HttpServletRequest req, MultipartFile upload) throws Exception{
        String path = req.getSession().getServletContext().getRealPath("/uploads/");
        File file = new File(path);
        if(!file.exists()) {    //若路径不存在,则创建一个文件夹
            file.mkdirs();
        }
        //获取上传文件名
        String fileName = upload.getOriginalFilename();
        //通过将文件名加上随机数以防止文件重复
        String fileID = UUID.randomUUID().toString().replace("-", "");
        fileName = fileID + "_" + fileName;
        //完成文件上传
        upload.transferTo(new File(path, fileName));

        return "success";
    }
}

在springmvc.xml中配置文件解析器

    <!--    配置文件解析器,其中id属性值是固定的,不能是其他名-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--      指定最大文件大小,单位是字节,此处是10兆  -->
    <property name="maxUploadSize" value="10485760"/>
</bean>

实现结果:

过程

(1)当我们选择完文件并点击上传按钮后,发出的请求首先到达前端控制器,它会将请求转至文件解析器;

(2)文件解析器会返回上传文件对象给前端控制器。以往的文件上传中的解析工作需要我们自己动手写,而文件解析器帮我们做了这一部分的工作。

// 创建磁盘文件项工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload fileUpload = new ServletFileUpload(factory);
// 解析request对象
List<FileItem> list = fileUpload.parseRequest(request);
// 判断文件项是普通字段,还是上传的文件
for (FileItem fileItem : list) {
if(fileItem.isFormField()) {
}else {
    // 上传文件项
}

(3)前端控制器会执行控制层对应的方法,该方法需要定义一个方法参数:MultipartFile类对象,它表示上传的文件,其中对象名必须和表单file标签的name属性名相同。

跨服务器的文件上传

在实际开发中,我们会有很多处理不同功能的服务器:负责部署应用 的应用服务器;运行数据库的数据库服务器;负责处理大并发访问的缓存和消息的缓存和消息服务器以及负责存储用户上传文件的文件服务器等。

新建一个Module项目FileServer作为服务器

在FileServer中添加依赖:

<dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-catalina</artifactId>
      <version>9.0.20</version>
</dependency>

配置FileServer的Tomcat

在target下的FileServer文件夹下创建存放图片的文件夹uploads

控制层类方法:

@RequestMapping("/User")
@Controller
public class UserController {
    @RequestMapping("/fileUploadCrossServer")
    public String fileUploadCrossServer(MultipartFile upload) throws Exception {
//        上传文件服务器路径
        String serverAddress = "http://localhost:9090/uploads/";
//        File file = new File(serverAddress);
//        if(!file.exists()) {    //若路径不存在,则创建一个文件夹
//            file.mkdirs();
//        }

        //获取上传文件名
        String fileName = upload.getOriginalFilename();
        //将文件名设置成唯一值
        String fileID = UUID.randomUUID().toString().replace("-", "").toUpperCase();
        fileName = fileID + "_" + fileName;

        Client client = Client.create();
//        与图片服务器进行连接
        WebResource webResource = client.resource(serverAddress + fileName);

//        上传文件
        webResource.put(upload.getBytes());
        return "success";
    }
}

在springmvc项目中添加依赖

<!-- 客户端对象 -->
    <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-client</artifactId>
      <version>1.19.4</version>
    </dependency>

上传文件请求:

    <form action="User/fileUploadCrossServer" method="post" enctype="multipart/form-data">
        选择文件:<input type="file" name="upload"><br>
        <input type="submit" value="跨服务器上传文件">
    </form>

点击上传按钮,即可观察到图片成功上传到FileServer项目

选择要上传的文件名为英文或数字是成功,但文件名为中文会报错: