SpringMVC_文件上传

一:文件上传

 1:创建文件上传的jsp文件(test_fileupload.jsp)

<body>
<from enctype="multipart/form-data" method="post" action="/upload.do">
    选择图片:<input type="file" name="photo">
    <input type="submit" value="上传">
</from>
</body>

 2:创建文件上传的Controller

在上传文件的方法中添加参数 MultiparFile,该参数本身是一个接口,该接口提供了文件上传的方法

// 获得文件名
getOriginalFilename()

// 判断是否上传了文件,如果没有选择文件上传的话,此时结果为true
isEmpty()

//获得上传文件的文件类型
getContentType()

// 将文件上传至指定目录中
transferTo(File file)

// 获取表单中input的name值
getName()

// 获取上传文件的byte数组
getBytes()

// 获取上传文件的InputStream对象
getInputStream()

方法中需要的另一个参数为 HttpSession,其作用是获取服务器中用来存放上传文件的路径

package com.doaoao.comtroller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpSession;
import java.io.File;

@Controller
public class UploadController {
    @RequestMapping("/upload.do")
    public ModelAndView upload(MultipartFile photo, HttpSession session) throws Exception{
        ModelAndView mv = new ModelAndView();
        // 判断用户是否上传文件
        if(!photo.isEmpty()){
            // 取得服务器上传的文件路径
            String path = session.getServletContext().getRealPath("/upload");

            // 获取文件名称
            String filename = photo.getOriginalFilename();

            // 限制文件的上传类型
            if("image/png".equals(photo.getContentType())){
                File file = new File(path,filename);
                photo.transferTo(file);
            }else{
                // 文件上传失败时
                mv.addObject("msg","请选择文件格式为png");
                mv.setViewName("/upload_fail");
                return mv;
            }
        }else{
            mv.addObject("msg","请上传一张png格式图片");
            mv.setViewName("/upload_fail");
            return mv;
        }
        // 文件上传成功时
        mv.setViewName("/upload_success");
        return mv;
    }
} 

3:两种文件上传方式

  # 1 使用 apache中的commons-io 和 commons-fileupload实现文件上传

  # 2 使用servlet3.0实现文件上传

## 第一种文件上传方式:使用 apache中的commons-io 和 commons-fileupload实现文件上传

<!-- 导入相关jar包 -->
<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.6</version>
</dependency>
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.3.3</version>
</dependency>

修改配置文件 springmvc.xml

<!--注册multipartResolver,由DispatcherServlet来负责调用,id的名称必须写为 multipartResolve-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--设置字符编码防止文件名乱码-->
    <property name="defaultEncoding" value="utf-8"/>
    <!--设置上传文件的总大小,单位是字节b-->
    <property name="maxUploadSize" value="1048576"/>
    <!--设置单个上传文件的大小,单位是字节b-->
    <property name="maxUploadSizePerFile" value="1048576"/>
    <!--设置内存缓冲区的大小,当超过该值的时候会写入到临时目录-->
    <property name="maxInMemorySize" value="1048576"/>
    <!--设置临时目录-->
    <property name="uploadTempDir" value="tempupload"/>
    <!--默认是false,如果设置为true的话,不会将文件路径去除,在IE浏览器下上传时会将路径名也作为文件名上传-->
    <property name="preserveFilename" value="false"/>
    <!--是否使用懒加载,默认是false-->
    <property name="resolveLazily" value="true"/>
</bean>

   上方配置文件中设置临时目录的作用:

    1:提高安全性:将文件上传到临时目录,相当于对客户端隐藏了文件真实存放的目录

    2:便于管理:当用户取消文件上传或文件上传失败时,可直接操作临时目录即可,无需对真实目录进行操作

## 第二种文件上传的方式:使用servlet3.0实现文件上传

修改web.xml配置文件的内容

<!--使用servlet3.0实现文件上传-->
<multipart-config>
    <!--临时文件路径,临时文件路径需配置在第一行-->
    <location>/temp</location>
    <!--单个上传文件的最大值,单位是byte-->
    <max-file-size>100</max-file-size>
    <!--总上传文件的最大值-->
    <max-request-size>52428800</max-request-size>
    <!--内存缓冲区的大小,当超过该值时,会写入到临时文件中,单位是byte-->
    <file-size-threshold>1024</file-size-threshold>
</multipart-config>

修改配置文件 springmvc.xml

<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/>
 二:上传多个文件

1:修改jsp文件种的内容

<from enctype="multipart/form-data" method="post" action="/upload.do">
    选择图片:<input type="file" name="photos">
    选择图片:<input type="file" name="photos">
    选择图片:<input type="file" name="photos">
    <input type="submit" value="上传">
</from>

2:在Controller种添加方法,方法种添加参数 MultipartFile[],并在参数前加上注解@RequestParam

package com.doaoao.comtroller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpSession;
import java.io.File;

@Controller
public class UploadController {
    @RequestMapping("/upload.do")
    public ModelAndView upload(@RequestParam MultipartFile[] photos, HttpSession session) throws Exception{
        ModelAndView mv = new ModelAndView();
        // 取得服务器上传的文件路径
        String path = session.getServletContext().getRealPath("/upload");

        for(MultipartFile photo:photos) {
            // 判断用户是否上传文件
            if (!photo.isEmpty()) {
                // 获取文件名称
                String filename = photo.getOriginalFilename();

                // 限制文件的上传类型
                if ("image/png".equals(photo.getContentType())) {
                    File file = new File(path, filename);
                    photo.transferTo(file);
                } else {
                    // 文件上传失败时
                    mv.addObject("msg", "请选择文件格式为png");
                    mv.setViewName("/upload_fail");
                    return mv;
                }
            } else {
                mv.addObject("msg", "请上传一张png格式图片");
                mv.setViewName("/upload_fail");
                return mv;
            }
        }
        // 文件上传成功时
        mv.setViewName("/upload_success");
        return mv;
    }
}

 ...

...

上一篇:管理文件


下一篇:CMSC 216 Exercise #4 Spring 2019