文章目录
一.准备工作
简易文件上传 , 目前只实现一个上传并回显功能
版本
- IDEA2020.3
- jdk1.8
- tomcat8.5.70
- nginx1.23.0
- maven3.6.3
资料:https://download.csdn.net/download/qq_45084064/86147355
二.功能请求
绝对路径: http:localhost:8080/mvc/upload/ajax
图片磁盘路径: D:/images/
图片代理路径: http:image.com/
功能 | 路径 | 请求方式 | 请求参数 | 响应结果 |
---|---|---|---|---|
上传图片 | upload/ajax | POST | 图片信息 | SysResult |
三.配置文件
3.1.pom文件
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!--mybatis相关-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.15</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
<!--spring相关依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- Spring 进行 JSON 数据转换依赖 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.0</version>
</dependency>
<!--spring整合mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.3</version>
</dependency>
<!--springMVC相关依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--打印日志-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!--文件上传-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
3.2. applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--开启注解扫描-->
<context:component-scan base-package="com.it.service"/>
</beans>
3.3.spring-mvc.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启注解组件扫描-->
<context:component-scan base-package="com.it.controller"/>
<!--开启mvc注解支持-->
<mvc:annotation-driven/>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".html"/>
</bean>
<!--文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<property name="maxUploadSize" value="10485760"/>
</bean>
<!--开启静态资源访问-->
<mvc:default-servlet-handler/>
</beans>
3.4.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!--前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
<!-- <param-value>classpath:spring-mvc.xml,classpath:applicationContext.xml</param-value>-->
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--post请求中文过滤器-->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--加载spring环境-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
四.后端
只是进行简单的数据封装,没有持久化
VO层
package com.it.vo;
import java.io.Serializable;
/**
* 图片信息封装
*/
public class ImgVO implements Serializable {
private Integer id;
private String filename;
private String UUIDName;
private String url;
private String virtualUrl;
@Override
public String toString() {
return "ImgVO{" +
"id=" + id +
", filename='" + filename + '\'' +
", UUIDName='" + UUIDName + '\'' +
", url='" + url + '\'' +
", virtualUrl='" + virtualUrl + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public String getUUIDName() {
return UUIDName;
}
public void setUUIDName(String UUIDName) {
this.UUIDName = UUIDName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getVirtualUrl() {
return virtualUrl;
}
public void setVirtualUrl(String virtualUrl) {
this.virtualUrl = virtualUrl;
}
}
package com.it.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 统一返回信息封装
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SysResult {
private Integer code; //响应码,200成功,400失败
private String msg; //信息
private Object data; //数据
public static SysResult success(){
return new SysResult(200,"调用方法成功",null);
}
public static SysResult success(Object data){
return new SysResult(200,"调用方法成功",data);
}
public static SysResult success(String msg,Object data){
return new SysResult(200,msg,data);
}
public static SysResult fail(){
return new SysResult(400,"调用方法失败",null);
}
public static SysResult fail(Object data){
return new SysResult(400,"调用方法失败",data);
}
}
controller层
package com.it.controller;
import com.it.service.FileService;
import com.it.vo.ImgVO;
import com.it.vo.SysResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpSession;
@RestController
@RequestMapping("/upload")
public class FileController {
@Autowired
private FileService fileService;
@PostMapping("/ajax")
public SysResult ajaxUpload(MultipartFile file,
HttpSession session) {
ImgVO imgVO;
try {
imgVO = fileService.imgUpload(file, session);
}catch (Exception e){
return SysResult.fail(e.getMessage());
}
return SysResult.success(imgVO);
}
}
service层
package com.it.service;
import com.it.vo.ImgVO;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpSession;
public interface FileService {
/**
* 对上传的文件进行处理
* @param file 上传的文件
* @param session 会话
* @return 处理的信息
*/
ImgVO imgUpload(MultipartFile file, HttpSession session);
}
package com.it.service;
import com.it.vo.ImgVO;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
@Service
public class FileServiceImpl implements FileService {
private final String DIR = "D://images";
private final String HTTP = "http://image.com";
/**
* 对上传的文件进行处理
* 1.文件类型的校验
* 2.检验是否为恶意程序
* 3.文件存储
*
* @param file 上传的文件
* @param session 会话
* @return 处理的信息
*/
@Override
public ImgVO imgUpload(MultipartFile file, HttpSession session) {
if (file.isEmpty()) throw new RuntimeException("上传出现问题");
// 获取文件名
String filename = file.getOriginalFilename();
//后缀判断
if (!filename.toLowerCase().matches("^.+\\.(jpg|jpeg|png)$"))
throw new RuntimeException("上传类型必须符合后缀为png,jpg,jpeg");
// 防止恶意程序
try {
BufferedImage image = ImageIO.read(file.getInputStream());
int width = image.getWidth();
int height = image.getHeight();
if (width == 0 || height == 0)
throw new RuntimeException("错误文件");
} catch (IOException e) {
e.printStackTrace();
}
//创建存储目录
// //1.获取tomcat服务器的存放路径
// ServletContext context = session.getServletContext();
// String path = context.getRealPath("upload");
// File dir = new File(path);
// if (!dir.exists()) dir.mkdirs();
//2.创建存放路径
String datePath = new SimpleDateFormat("/yyyy/MM/dd").format(new Date());
File localPath = new File(DIR + datePath);
if (!localPath.exists()) localPath.mkdirs();
//3.文件重命名
//3.1.获取后缀
String suffix = filename.substring(filename.lastIndexOf("."));
String imgName = UUID.randomUUID().toString()+suffix;
//文件上传
String filePath = localPath +"\\"+ imgName;
try {
file.transferTo(new File(filePath));
} catch (IOException e) {
e.printStackTrace();
}
ImgVO vo = new ImgVO();
vo.setFilename(filename);
vo.setUUIDName(imgName);
vo.setUrl(DIR + datePath);
// url响应地址
String virtualUrl = HTTP+datePath+"\\"+imgName;
vo.setVirtualUrl(virtualUrl);
return vo;
}
}
五.前端
引入jQuery.js,利用ajax请求
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ajax提交</title>
<link rel="stylesheet" href="css/bootstrap.css">
<script src="js/jquery-2.1.1.js"></script>
<script src="js/bootstrap.js"></script>
</head>
<body>
<h1>测试文件上传</h1>
<div class="images">
<span>上传文件</span>
<input type="file" name="file" id="formFile">
<br>
<input type="submit" id="upload">
</div>
<script type="application/javascript">
$("#upload").on("click",function (){
let form = new FormData()
form.append("file",$("#formFile")[0].files[0])
$.ajax({
url: "upload/ajax",
type: "post",
data: form,
processData:false,
contentType:false,
success(res){
if (res.code === 200){
console.log(res.data)
let str = `<div><img src="${res.data.virtualUrl}" width="400px"><div>`
$(str).appendTo($("body"))
}
if (res.code === 400){
alert(res.data)
}
}
})
})
</script>
</body>
</html>
六.nginx代理
利用nginx反向代理本地磁盘存放的图片目录. 因为本次在win机操作,下载windows版本即可.
6.1.nginx下载以及操作
nginx下载路径: http://nginx.org/en/download.html
# 找到解压的nginx路径
# 启动
start nginx
# 停止
nginx -s stop
# 重启
nginx -s reload
# 测试 - 更改配置文件时使用
nginx -t
6.2.更改nginx.conf文件
nginx解压路径下conf目录
server {
listen 80; # 监听80端口
server_name image.com; # 域名
location / { # 拦截策略 - 拦截全部请求
root D:/images/; # root(磁盘目录)
}
}
6.3.修改hosts文件
路径: C:\Windows\System32\drivers\etc\hosts
# IP 域名
127.0.0.1 image.com
七.测试
- 启动nginx
-
启动项目
-
上传文件测试
-
查看本地磁盘是否存在文件
-
通过域名进行请求 - http://image.com/代理的图片路径