springmvc-文件上传

一.准备工作

简易文件上传 , 目前只实现一个上传并回显功能

版本

  • 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/ajaxPOST图片信息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/代理的图片路径
    在这里插入图片描述

八.参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值