文件上传的必要前提:

  • form表单的enctype取值必须是:multipart/form-data。默认是:application/x-www-form-urlencoded。enctype:是表单请求正文的类型。
  • method属性取值必须是post。
  • 提供一个文件选择域<input type="file"/>

借助第三方组件实现文件上传

       使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑。

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>

SpringMVC 传统方式的文件上传

说明:传统方式的文件上传,指的是上传的文件和访问的应用存在于同一个服务器上,并且上传完成之后,浏览器可以跳转。

实现步骤:

第一步:导入commons-fileupload依赖

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>

第二步:编写jsp页面

<form enctype="multipart/form-data" method="post" action="${pageContext.request.contextPath}/fileUpload">
    名称:<input type="text" name="picName"/>
    <%--file元素的name必须和Controller中方法中参数名保持一致--%>
    图片:<input type="file" name="uploadFile"/>
    <input type="submit" value="上传"/>
</form>

第三步:编写控制器

@Controller("fileUploadController")
public class FileLoadController {
    @RequestMapping("/fileUpload")
    public String fileUpload(Model model, MultipartFile uploadFile,String picName,HttpServletRequest request) throws IOException {
        //定义文件名
        String fileName = "";
        //获取原始文件名
        String uploadFileName = uploadFile.getOriginalFilename();
        //获取文件扩展名
        String extendName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1, uploadFileName.length());
        //把文件名上加上随机数,防止文件重复
        String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase();
        //判断文件名是否重复
        if (!StringUtils.isEmpty(picName)) {
            fileName = uuid + "_" + picName + "." + extendName;
        } else {
            fileName = uuid + "_" + uploadFileName;
        }
        //获取文件路径
        ServletContext context =request.getSession().getServletContext();
        String basePath = context.getRealPath("/uploads");
        //以日期命名目录,用以解决同一个文件夹过多问题
        String datePath = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        //判断路径是否存在
        File file = new File(basePath + "/" + datePath);
        if (!file.exists()) {
            file.mkdirs();
        }
        //使用MultipartFile接口中方法,把上传的文件写到指定位置
        uploadFile.transferTo(new File(file,fileName));
        model.addAttribute("message", "上传成功");
        return "success";
    }
}

第四步:配置文件服务器

    <!--配置文件上传解析器 其中bean的id是固定不变的 "multipartResolver"-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--设置文件上传的最大大小-->
        <property name="maxUploadSize">
            <value>5242880</value>
        </property>
    </bean>

注意:文件上传的解析器id是固定不变的,不能起别的名称,否则无法实现请求参数的绑定。(不仅是文件,其他字段也无法绑定)

springmvc跨服务器方式的文件上传

分服务器的目的

在实际开发中,需要不同功能的服务器。

  • 应用服务器:负责部署系统应用
  • 数据库服务器:运行系统的数据库
  • 缓存和消息服务器:负责处理大并发访问的缓存和消息
  • 文件服务器:负责存储用户上传文件的服务器

分服务器处理的目的是让服务器各司其职,从而提高项目的运行效率。

 

 第一步:添加依赖

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-core</artifactId>
            <version>1.18.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-client</artifactId>
            <version>1.18.1</version>
        </dependency>

第二步:编写jsp页面

<form method="post" action="${pageContext.request.contextPath}/fileUpload" enctype="multipart/form-data">
    <input type="text" name="picName"/><br>
    <input type="file" name="picfile"/><br>
    <input type="submit" value="上传"/>
</form>

第三步:编写控制器

@Controller
public class FileController {
    //另一台服务器的文件目录
    private final String FILESERVERURL="http://localhost:8080/SpringMVC01_war/uploads/";

    @RequestMapping("/fileUpload")
    public String fileUpload(Model model, MultipartFile picfile,String picName) throws IOException {
        String fileName="";
        //获取原始文件的文件名
        String uploadFileName=picfile.getOriginalFilename();
        //获取文件的扩展名
        String extendName=uploadFileName.substring(uploadFileName.lastIndexOf(".")+1,uploadFileName.length());
        //在文件上添加随机数,确保不重复
        String uuid= UUID.randomUUID().toString().replace("-","").toUpperCase();
        //判断是否输入了文件名
        if (!StringUtils.isEmpty(picName)) {
            fileName = uuid + "_" + picName + "." + extendName;
        } else {
            fileName = uuid + "_" + uploadFileName;
        }
        //创建客户端对象
        Client client = Client.create();
        //与服务器进行连接
        WebResource resource = client.resource(FILESERVERURL + fileName);
        //进行文件上传,并将文件转换成字节流
        String result = resource.put(String.class, picfile.getBytes());
        System.out.println(result);
        model.addAttribute("message","上传成功");
        return "success";
    }
}

第四步:配置解析器

    <!--配置文件上传解析器 其中bean的id是固定不变的 "multipartResolver"-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--设置文件上传的最大大小-->
        <property name="maxUploadSize">
            <value>5242880</value>
        </property>
    </bean>

第五步:设置目标服务器tomcat的配置文件。conf目录下web.xml中<Servlet></Servlet>里面添加,否则就会报错405 Method Not Allowed。

        <init-param>
            <param-name>readonly</param-name>
            <param-value>false</param-value>
        </init-param>

 

 posted on 2019-11-29 16:59  会飞的金鱼  阅读(159)  评论(0)    收藏  举报