Spring MVC 文件上传简单示例(form、ajax方式 )
1、Form Upload
SpringMVC 中,文件的上传是通过 MultipartResolver 实现的,所以要实现上传,只要注册相应的 MultipartResolver 即可。
MultipartResolver 的实现类有两个:
CommonsMultipartResolver(需要 Apache 的 commons-fileupload 支持,它能在比较旧的 servlet 版本中使用,兼容性好)StandardServletMultipartResolver(不需要第三方 jar 包支持,它使用 servlet 内置的上传功能,但是只能在 Servlet 3 以上的版本使用
以 StandardServletMultipartResolver 为例,使用步骤如下。
首先,在 web.xml 中为 DispatcherServlet 配置 Multipart:
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<multipart-config>
<max-file-size>5242880</max-file-size> <!-- 上传文件的大小限制,比如下面表示 5 M -->
<max-request-size>10485760</max-request-size> <!-- 一次表单提交中文件的大小限制,必须下面代表 10 M -->
<file-size-threshold>0</file-size-threshold> <!-- 多大的文件会被自动保存到硬盘上。0 代表所有 -->
</multipart-config>
</servlet>
其次,在spring中注册MultipartResolver:
<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"></bean>
然后就可以使用了。
前端代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="filename">
<input type="submit" value="提交">
</form>
</body>
</html>
后端代码:
package com.oukele.web; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern; @Controller
@RequestMapping(path = "/upload")
public class FileUploadController { @RequestMapping(path = "",method = RequestMethod.GET)
public String getPage(){
return "fileupload";
} @PostMapping
public String fileUpload(@RequestPart("filename")MultipartFile multipartFile, HttpServletRequest request) {
if( !multipartFile.isEmpty() ){
//验证文件是否为图片格式 && 文件大小不能超过 5M 1KB = 1024B
if( multipartFile.getContentType().contains("image/") && multipartFile.getSize() < 1024 * 1024 * 1024 * 5 ){
//图片的存储文件夹
String save = request.getServletContext().getRealPath("/images");
File file = new File(save);
if( !file.exists() ){
file.mkdirs();
}
//文件名
String fileName =multipartFile.getOriginalFilename().substring(0,multipartFile.getOriginalFilename().indexOf("."));
//上传文件的后缀
String zhui = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().indexOf("."),multipartFile.getOriginalFilename().length());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
//生成新的文件名
String fileNewName ="upload_"+fileName+"_"+simpleDateFormat.format(new Date())+zhui;
try {
//将此图片存储到images文件夹中
multipartFile.transferTo(new File(save+"\\"+fileNewName));
} catch (IOException e) {
e.printStackTrace();
} }else{
return "";
} } return "redirect:/upload";
} }
运行:

结果:

以ajax的方式,进行文件上传
前端代码:
<form action="#" method="post" enctype="multipart/form-data">
宠物图片: <input type="file" name="filename" id="update_pet_img" style="width: 70px">
</form>
<img style="margin-top: 50px" class="update_img" src="" width="100px" height="100px" alt="未上传图片">
js脚本
<script src="${pageContext.request.contextPath}/js/jquery-1.12.3.js"></script>
<script>
//修改区域-->,点击选择文件的时候实现自动上传图片。
$("#update_pet_img").change(function () {
var form = $(this).closest("form");
update_file_img(form);
});
//图片上传
function update_file_img(file) {
var formData = new FormData($(file)[0]);
//ajax请求
$.ajax({
type: "post",
url: "/imgUpload",
data: formData,
contentType: false,//告诉客户端不要设置Content-Type 请求头部
processData: false,//告诉客户端不处理过程数据
success: function (data) {//完成后的事件
$(".update_img").attr("src", data.img_src);//data.img_src得到图片的地址
},
error: function (error) {//出现错误时的事件
alert("出错啦。");
}
});
}
</script>
后端代码:(这里只是简单示例,练习可以适当减少)
package com.oukele.web; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date; @Controller
@RequestMapping(path = "/imgUpload")
public class FileUpload { /*
* 宠物图片上传
* */
@PostMapping(produces = "application/json;charset=utf-8")
@ResponseBody
public String imgUpload(@RequestPart("filename") MultipartFile multipartFile, HttpServletRequest request, HttpServletResponse response){
if (multipartFile.isEmpty()) {
return "{\"error\":\"文件为空,错误格式\"}";
}
if (!multipartFile.getContentType().contains("image/")) {
return "{\"error\":\"只允许上传图片的文件\"}";
}
if (multipartFile.getSize() > 1024 * 1024 * 1024 * 5) {
return "{\"error\":\"图片大小不能超过5M\"}";
}
//图片的存储文件夹
String save = request.getServletContext().getRealPath("/images");
File file = new File(save);
if (!file.exists()) {
file.mkdirs();
}
String file1 = createFile(save, multipartFile); return file1;
}
//创建文件夹,格式为以日期文件名 比如 2018112 , 和 新的文件名,格式为 upload_文件名_日期.后缀名
public String createFile(String path, MultipartFile multipartFile) {
boolean flag = false;
String imgpath ="";
//创建文件夹
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
String dataFile = "/" + simpleDateFormat.format(new Date());
path += dataFile;
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
//文件名
String fileName = multipartFile.getOriginalFilename().substring(0, multipartFile.getOriginalFilename().indexOf("."));
//上传文件的后缀
String zhui = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().indexOf("."), multipartFile.getOriginalFilename().length());
//生成新的文件名
String fileNewName = "upload_" + fileName + "_" + simpleDateFormat.format(new Date()) + zhui;
try {
//将此图片存储到对应的文件夹中
multipartFile.transferTo(new File(path + "/" + fileNewName));
imgpath ="/images"+dataFile+"/"+ fileNewName;
flag = true;
} catch (Exception e) {
flag = false;
e.printStackTrace();
}
if( flag ){
return "{\"img_src\":\""+imgpath+"\"}";
} return "{\"error\":\"出现异常\"}";
}
}
演示:

Spring MVC 文件上传简单示例(form、ajax方式 )的更多相关文章
- 【Java Web开发学习】Spring MVC文件上传
[Java Web开发学习]Spring MVC文件上传 转载:https://www.cnblogs.com/yangchongxing/p/9290489.html 文件上传有两种实现方式,都比较 ...
- Spring MVC 笔记 —— Spring MVC 文件上传
文件上传 配置MultipartResolver <bean id="multipartResolver" class="org.springframework.w ...
- Spring MVC文件上传教程 commons-io/commons-uploadfile
Spring MVC文件上传教程 commons-io/commons-uploadfile 用到的依赖jar包: commons-fileupload 1.3.1 commons-io 2.4 基于 ...
- Spring mvc文件上传实现
Spring mvc文件上传实现 jsp页面客户端表单编写 三个要素: 1.表单项type="file" 2.表单的提交方式:post 3.表单的enctype属性是多部分表单形式 ...
- Spring mvc 文件上传到文件夹(转载+心得)
spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...
- spring mvc 文件上传 ajax 异步上传
异常代码: 1.the request doesn't contain a multipart/form-data or multipart/mixed stream, content type he ...
- Strut2 和Spring MVC 文件上传对比
在Java领域中,有两个常用的文件上传项目:一个是Apache组织Jakarta的Common-FileUpload组件 (http://commons.apache.org/proper/commo ...
- 【Spring】Spring MVC文件上传--整合bootstrap-fileinput和jQuery-File-Upload
前言 这里分享两个使用Spring MVC进行文件上传的简单示例, 分别整合bootstrap-fileinput 和 Jquery File Upload , 代码十分简单, 都是入门的示例,因此这 ...
- Spring MVC文件上传处理
以下示例显示如何在使用Spring Web MVC框架的表单中上传文件和处理.首先使用Eclipse IDE来创建一个WEB工程,实现一个上传文件并保存的功能.并按照以下步骤使用Spring Web ...
随机推荐
- 业务型代码常用的SQL汇总(随时更新)
做了一年的业务代码开发,记录并分享一下自己平时在项目中遇到的比较好用的sql 1.查询表中是否某一字段下的数据有重复数据(以ID为例) SELECT id FROM 表名GROUP BY ID HAV ...
- Leetcode之动态规划(DP)专题-72. 编辑距离(Edit Distance)
Leetcode之动态规划(DP)专题-72. 编辑距离(Edit Distance) 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可 ...
- 关联规则(Apriori算法)
关联分析直观理解 关联分析中最有名的例子是“尿布与啤酒”.据报道,美国中西部的一家连锁店发现,男人们会在周四购买尿布和啤酒.这样商店实际上可以将尿布与啤酒放在一块,并确保在周四全价销售从而获利.当然, ...
- PHP Excel导入
public function importFile() { $file = request()->file('file'); $params = $this->request->p ...
- filebeat的层次架构图和配置部署 -- 不错的文档 - elasticsearch 性能调优 + Filebeat配置
1.fielbeat的组件架构-看出层次感 2.工作流程:每个harvester读取新的内容一个日志文件,新的日志数据发送到spooler(后台处理程序),它汇集的事件和聚合数据发送到你已经配置了Fi ...
- 【Linux-驱动】printk的打印级别
级别: 日志级别用宏表示,日志级别宏展开为一个字符串,在编译是由预处理器将它和消息本文拼接成一个字符串,因此printk函数中日志级别宏和格式字符串间不能有逗号.printk的日志级别定义在 /inc ...
- 双指针(最大删除子串)Codeforces Round #579 (Div. 3)--Remove the Substring (hard version)
题目链接:https://codeforces.com/contest/1203/problem/D2 题意: 给你S串.T串,问你最长删除多长的子串使得S串里仍然有T的子序列. 思路: 想了好久,先 ...
- jupyter 配置远程登陆
官方地址: https://jupyter-notebook.readthedocs.io/en/latest/public_server.html#notebook-server-security ...
- 【Tomcat】热部署的遗留配置导致服务器无法启动
1.问题描述: 今天用myeclipse写了个小demo,然后用Tomcat7 部署了,接着点击启动服务器,服务器居然报错: 严重: Error starting static Resources j ...
- Git复习(六)之标签管理
标签管理 发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库 ...