使用是SpringMVC+Hibernate搭建的WEB应用,使用jsp写的前端页面。

如何将文件上传到服务器呢?我这里使用的是Multipart的形式将文件上传。

这里有两大步:一是配置multipart解析器,二是处理multipart请求

  DispatcherServlet并没有实现任何解析multipart请求数据的功能。它将这个任务委托给Spring中的MultipartResolver 接口来实现。Spring3.1开始,Spring内置了两个MultipartResolver的实现。

  ①、CommonsMultipartResolver:使用Jakarta Commons FileUpload解析multipart 请求;

    使用这个实现需要依赖其他jar包。commons-fileupload jar包和 commons-io jar包

    如果你的WEB应用的容器是Servlet3.0以下的,那么就需要使用CommonsMultipartResolver来解决了。比如你使用的是Tomcat,那么如果是7.0以前的版本就是servlet3.0以下的(不太确定)。

  ②、StandardServletMultipartResolver:依赖于Servlet3.0对multipart请求的支持。

下面我使用的是第一种解析器:CommonsMultipartResolver 来完成上传文件的任务


一、使用CommonsMultipartResolver 来完成上传文件的任务

  一)、配置解析器

    ①、添加commons-fileupload-1.3.2 jar包、commons-io-2.5 jar包

    ②、创建一个配置类,配置 MultipartResolver

package com.zcd.config;

import java.io.IOException;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.FileSystemResource;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver; @Configuration
@ComponentScan
public class MyConfig
{
@Bean
public MultipartResolver multipartResolver() throws IOException
{
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); //指定上传文件的临时存储路径。
multipartResolver.setUploadTempDir(new FileSystemResource("E:/fileUploadTest_1")); return multipartResolver;
} }

  二)、处理multipart请求

    ①、先用jsp写一个表单,如下:

<form:form action="${pageContext.request.contextPath}/userController/save" method="POST"
modelAttribute="user" enctype="multipart/form-data" >
<form:hidden path="id"/>
姓名:<form:input path="name"/>
<br>
<form:hidden path="photo"/>
照片:<input type="file" name="photo1" accept="image/jpeg,image/png,image/gif" >
<br>
<input type="submit" name="Submit" value="保存" >
</form:form>

表单对应的前端界面:

    ②、响应的Controller中的方法,这里以字节数组的形式接受上传的文件。

    /*
* 以字节数组的形式接收上传的文件,如果要是上传多个文件的话,就要在加一个参数。这样会非常不方便。
*/
@RequestMapping(value="save", method=RequestMethod.POST)
public String save(@RequestPart(value="photo1") byte[] photo, User user)
{
/*
* 表单中的name属性值必须和@RequestPart的value属性值相等,而且还要以字节数组的形式接受上传的文件。
* 以字节数组的方式接收就不能查看文件的相关信息。
*/ //这里如何将的photo的全路径获取??????不能获取就不能将文件的路径保存到数据库中。 userService.save(user); return "success";
}

文件上传到了配置解析器时指定的目录中:

--------------------------------------------------------------------------------------------------------------------

如果想上传多个文件呢??怎么办???可以MultipartFile数组的形式接收上传的文件。

jsp代码:

    <form:form action="${pageContext.request.contextPath}/userController/uploadPotos" method="POST" modelAttribute="user" enctype="multipart/form-data" >
<form:hidden path="id"/>
姓名:<form:input path="name"/>
<br>
<form:hidden path="photo"/>
图片1:<input type="file" name="files" accept="image/jpeg,image/png,image/gif" >
<br>
图片2:<input type="file" name="files" accept="image/jpeg,image/png,image/gif" >
<br>
<input type="submit" name="Submit" value="保存" >
</form:form>

注意:①、本例中name属性中的属性值files,要和Controller中的方法的相应的参数名相同如: @RequestPart MultipartFile[] files 

   ②、本例中的User对象只有一个photo字段,所以只能保存一个文件在磁盘上的路径,这里是为了方便,没有再增加一个字段来保存第二张图片的路径。这里仅仅是为了示范如何以MultipartFile数组的形式接收多个文件的。

可以使用MultipartFile接口接收上传的文件。需要修改Controller中的处理方法。代码如下:

    /*
* 以MultipartFile的形式接收文件,而且可以只需要一个@RequestPart 注解,以MultipartFile[] 数组的形式接收上传的文件。
*/
@RequestMapping(value="uploadPotos")
public String uploadPotos(@RequestPart MultipartFile[] files, User user) throws IllegalStateException, IOException
{
//将第一个file对象的全路径作为User的photo字段的值保存到数据库中。
MultipartFile file = files[0];
String filePath = "E:/fileUploadTest_1/" + file.getOriginalFilename(); user.setPhoto(filePath); userService.save(user); for(MultipartFile f : files)
{
System.out.println("文件原始名称:" + f.getOriginalFilename());
/*
* 以MultipartFile的形式接受上传的文件,那么之前在配置解析器的时候指定的保存上传文件的目录就不行了。
* 这里使用MultipartFile给我们提供的transferTo()方法将文件保存到文件系统中。
*/
f.transferTo(new File("E:/fileUploadTest_1/" + f.getOriginalFilename()));
}
return "success";
}

将文件保存到系统目录后的截图


二、使用StandardServletMultipartResolver 解析器来完成上传文件的任务

  一)、配置StandardServletMultipartResolver 解析器

     这个不需要依赖额外的jar包

package com.zcd.config;

import java.io.IOException;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.support.StandardServletMultipartResolver; @Configuration
@ComponentScan
public class MyConfig
{
@Bean
public MultipartResolver multipartResolver() throws IOException
{
return new StandardServletMultipartResolver();
}
}

为上传的文件指定一个临时路径、还可以配置其他的如文件的大小等等

使用web.xml来配置

    <servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!-- 支持文件上传 -->
<multipart-config>
<!-- 指定上传的文件的临时存储目录 -->
<location>E:/multipartTest4</location>
</multipart-config>
</servlet>

  二)、处理Multipart请求

    @RequestMapping(value="uploadPotos")
public String uploadPotos(@RequestPart MultipartFile[] files, User user) throws IllegalStateException, IOException
{ for(MultipartFile f : files)
{
System.out.println("文件原始名称:" + f.getOriginalFilename().substring(f.getOriginalFilename().lastIndexOf("\\") + 1));
/*
* 以MultipartFile的形式接受上传的文件,那么之前在配置解析器的时候指定的保存上传文件的目录就不行了。
* 这里使用MultipartFile给我们提供的transferTo()方法将文件保存到文件系统中。
* 使用StandardServletMultipartResolver解析器与CommonsMultipartResolver解析器有一个不同的地方,就是getOriginalFileName()方法获取得到的名称不一样,一个是获取到全路径,一个仅仅是获取文件名称。
*/
String filePath = "E:/fileUploadTest_2/" + f.getOriginalFilename().substring(f.getOriginalFilename().lastIndexOf("\\") + 1);
f.transferTo(new File(filePath)); user.setPhoto(filePath); userService.save(user); }
return "list2";
}

SpringMVC WEB应用上传照片的实现的更多相关文章

  1. SpringMVC整合fastdfs-client-java实现web文件上传下载

    原文:http://blog.csdn.net/wlwlwlwl015/article/details/52682153 本篇blog主要记录一下SpringMVC整合FastDFS的Java客户端实 ...

  2. springmvc图片文件上传接口

    springmvc图片文件上传 用MultipartFile文件方式传输 Controller package com.controller; import java.awt.image.Buffer ...

  3. SpringMVC学习--文件上传

    简介 文件上传是web开发中常见的需求之一,springMVC将文件上传进行了集成,可以方便快捷的进行开发. springmvc中对多部件类型解析 在 页面form中提交enctype="m ...

  4. Spring +SpringMVC 实现文件上传功能。。。

    要实现Spring +SpringMVC  实现文件上传功能. 第一步:下载 第二步: 新建一个web项目导入Spring 和SpringMVC的jar包(在MyEclipse里有自动生成spring ...

  5. springMVC+jsp+ajax上传文件

    工作中遇到的小问题,做个笔记 实现springMVC + jsp + ajax 上传文件 HTML <body> <form id="myform" method ...

  6. Java Web文件上传

    参考资料:http://www.cnblogs.com/xdp-gacl/p/4200090.html 一.问题描述 Java Web文件上传需要借助一些第三方库,常用的是借助Apache的包,有两个 ...

  7. SpringMVC的文件上传

    首先导入jar包 在springMVC里面配置文件上传,以及限定上传文件的大小  <bean id="multipartResolver" class="org.s ...

  8. SpringMVC之文件上传异常处理

    一般情况下,对上传的文件会进行大小的限制.如果超过指定大小时会抛出异常,一般会对异常进行捕获并友好的显示出来.以下用SpringMVC之文件上传进行完善. 首先配置CommonsMultipartRe ...

  9. Web 文件上传 目录

    0. SpringMVC -- 梗概--源码--贰--上传 1. Web上传文件的原理及实现 2. Web文件上传方法总结大全 3. SpringMVC 文件上传配置,多文件上传,使用的Multipa ...

随机推荐

  1. Chrome Command API

    Chrome Command API 参考 Chrome开发工具已经强大得令人发指了,除了可通过UI操作的各种功能外,还提供了基于控制台的命令行方法,极大地方便了开发调试.现在就来领略下Chrome ...

  2. MySQL的四种事务隔离级别【转】

    本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...

  3. Java温故而知新(3)异常处理机制

    异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出 ...

  4. json转换工具类

    using System;using System.Collections.Generic;using System.Text;using Newtonsoft.Json;using System.I ...

  5. 定时器实现方式之TimerTask、Timer

    在未来某个指定的时间点或者经过一段时间延迟后执行某个事件,这时候就需要用到定时器了.定时器的实现方式有很多种,今天总结最简单的实现方式.java 1.3引入了定时器框架,用于在定时器上下文中控制线程的 ...

  6. jquery获取下拉框中的循环值

    <select class="test" id="projectno" name="projectno"> <option ...

  7. 基础架构之日志管理平台搭建及java&net使用

    在现代化的软件开发流程中,日志显得非常的重要,不可能再零散的游离在各个项目中,等查看日志的时候再登录服务器去到特定的目录去查看,这显然很繁琐且效率低下,所有整合一套日志管理平台,也显得非常重要,这篇文 ...

  8. SpringBoot框架下基于Junit的单元测试

    前言 Junit是一个Java语言的单元测试框架,被开发者用于实施对应用程序的单元测试,加快程序编制速度,同时提高编码的质量.是一个在发展,现在已经到junit5,在javaEE开发中与很多框架相集成 ...

  9. 【Android】移动项目位置

    一.前言 有时候,我们新建一个项目后,因为一些原因想要重新移动项目到别的文件夹.然而,移动到新的文件夹后,却发现之前好好的项目运行不了.点击运行后,弹出如下对话框.  Installation fai ...

  10. EF多实体对应单表

    1.EF多实体对应单表 适用场景:单数据库表,表数据有较长用字段,有不常用或者大数据字段. 2.建表语句 CREATE TABLE [Chapter2].[Photograph]( ,) primar ...