SpringMvc的文件上传

后端:spring、springmvc、mybatis

前端:vue-element-admin

数据库:MySQL

服务器:多个Tomcat(启动后端项目、图片存放位置)

文件服务器

Tomcat作为文件保存服务器下面代码根据具体需求设置到Tomcat中的conf文件夹下的server.xml中的<Host>标签内</Host>

<!--
    path:访问的url,比如设置path为/pic,当我们运行web项目的时候,访问的url就是:127.0.0.1:8080/pic 
    docBase:硬盘保存地址
    reloadable:建议设置false,如果为true会实时检测WEB-INF/classes和WEB-INF/lib目录下class文件的变动,如有变动,会重新加载web应用。
                虽然有助于调试servlet和其它的class文件,但这样用加重服务器运行负荷
 -->
<Context path="/pic" docBase="D:/Tomcat8.5.23/files" reloadable="false"></Context>

如果使用其他服务器请根据具体服务器进行配置

maven项目:

webapp中需要配置内容如下:

pom.xml中 文件上传依赖


    <!--  文件上传依赖 start -->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.3</version>
    </dependency>
    <!--  文件上传依赖 end -->

web.xml 配置项:

   <!--配置核心加载器-->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

 DispatcherServlet-servlet.xml 配置项:

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--编码-->
        <property name="defaultEncoding" value="utf-8"/>
        <!--上传大小(-1:不做任何限制)-->
        <property name="maxUploadSize" value="-1"/>
    </bean>

后端代码:controler层

将文件上传功能、添加和更新功能同时提交到后端,下面代码只实现单个前端文件上传功能

@ResponseBody
@Controller
@CrossOrigin
public class FileController {
    //本地保存地址,另一个Tomcat当做服务器进行文件上传成功后的保存位置
    private final String fileLocal = "D:\\Tomcat8.5.23\\files";

    @Resource
    private GoodsService goodsService;//mapper层的接口:主要的增删改查。

    //file:前端传入的文件
    //goodsId:更新时的主键id
    @RequestMapping(value = "/fileUpload")
    public Result fileUpload(MultipartFile file, Integer goodsId) throws IOException {
        //获取前端上传的文件名称
        String filename = file.getOriginalFilename();
        //获取文件格式
        //filename.lastIndexOf("."):从.开始进行截取
        //filename.length():到文件名长度进行截取结束
        String suffix = filename.substring(filename.lastIndexOf("."), filename.length());
        //对文件上传格式进行限制(可以设置为具体的格式--根据自己的需求设置)
        if (suffix.contains(".jpg") || suffix.contains(".jpeg") || suffix.contains(".png") || suffix.contains(".gif")) {
            //生成新的文件名称(通过UUID生成唯一的名称)
            filename = UUID.randomUUID().toString() + suffix;
            //将文件保存到服务器中(Tomcat作为服务器保存的位置)
            file.transferTo(new File(fileLocal + "/" + filename));
        
            if (goodsId != null) {//判断bookId是否有值
                //调用删除旧的图片地址的方法
                deleteFile(goodsId);
            }

            //将图片在服务器端的地址返回(为了将地址传入到数据库中进行保存)
            return bookUrl= new Result("/pic/" + filename);         
        } else {
            //上传失败时返回异常
            throw new BookException(BookStatus.FILE_SUFFIX_ERROR);
        }
    }

    //删除旧文件方法
    public void deleteFile(Integer goodsId) {
        //查询数据库中是否有数据
        Goods goods = goodsService.getGoodsOne(goodsId);
        //获取数据库中保存的url地址
        String goodsUrl = goods.getGoodsUrl();//例如:bookUrl存储格式:"/pic/9359e585-7c59-4c8a-9648-c5600f76db85.jpg"

        //通过bookId查询数据库表bookUrl是否为有值
        if (goodsUrl != null) {
            //删除之前拼接的'/pic/';+5是获取‘/pic/’并从第5个开始截取(因为使用的并非单个字符串所以要加上从数字,代表从第几个开始截取)
            //获取旧的文件的真实文件名
            String suffix1 = goodsUrl.substring(goodsUrl.lastIndexOf("/pic/") + 4, goodsUrl.length());
            //拼接真实地址
            goodsUrl = fileLocal +"\\" + suffix1;
            //将本地文件加入到File中
            File fileToDelete = new File(goodsUrl);
            //通过File中的删除方法,将本地存放的旧文件进行删除
            boolean success = fileToDelete.delete();
            if (success) {
                System.out.println("旧的文件删除成功……");
            } else {
                System.out.println("旧的文件删除失败……");
            }
        } else {
            System.out.println("数据库中,未存储文件地址……");
        }
    }

}

对文件地址方面进行解释下:

        不使用具体的文件保存地址 保存到数据库,是为了便于后期的文件迁移

        (将文件迁移到新地址后,只需要更改服务器配置就可以了,不需要对数据库保存的文件地址进行更改)

上述为上传功能的个人学习记录,代码不全,仅可作为思路参考。

----------个人学习笔记----------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值