SpringBoot实现文件上传接口[通俗易懂]

SpringBoot实现文件上传接口[通俗易懂]摘要公司都是采用SpringBoot作为项目框架,其实SpringBoot和SSM框架很接近,基本上只是将SSM的一些配置项修改为自动配置或者简单的注解配置就可以了,建议不了解的SpringBoot的朋友们可以了解一下,上手很快,其实文件上传框架根本没有多大关系。我只是顺便帮SpringBoot打个广告罢了。正题需求:需要实现一个文件上传的web接口。1、先实现一个Controll…

大家好,又见面了,我是你们的朋友全栈君。

摘要

公司都是采用SpringBoot作为项目框架,其实SpringBoot和SSM框架很接近,基本上只是将SSM的一些配置项修改为自动配置或者简单的注解配置就可以了,建议不了解的SpringBoot的朋友们可以了解一下,上手很快,其实文件上传框架根本没有多大关系。我只是顺便帮SpringBoot打个广告罢了。

正题

需求:需要实现一个文件上传的web接口。
1、先实现一个Controller接口,如下:

package com.lanxuewei.utils.aspect;

import com.lanxuewei.utils.interceptor.annotation.AppIdAuthorization;
import com.lanxuewei.utils.model.ReturnCodeAndMsgEnum;
import com.lanxuewei.utils.model.ReturnValue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/** * @author lanxuewei Create in 2018/7/3 20:01 * Description: aop 测试控制器 */
@RestController
@RequestMapping(value = "/aop")
public class TestController {

    private static final Logger logger = LoggerFactory.getLogger(TestController.class);

    @Autowired
    private TestService testService;

    /** * 文件上传测试接口 * @return */
    @AppIdAuthorization
    @RequestMapping("/upload")
    public ReturnValue uploadFileTest(@RequestParam("uploadFile") MultipartFile zipFile) {
        return testService.uploadFileTest(zipFile);
    }
}

2、Service接口如下:

package com.lanxuewei.utils.aspect;

import org.springframework.web.multipart.MultipartFile;

import com.lanxuewei.utils.model.ReturnValue;

public interface TestService {

    public ReturnValue uploadFileTest(MultipartFile zipFile);
}

3、Service实现如下:

package com.lanxuewei.utils.aspect;

import com.lanxuewei.utils.model.ReturnCodeAndMsgEnum;
import com.lanxuewei.utils.model.ReturnValue;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.UUID;

/** * @author lanxuewei Create in 2018/8/14 10:01 * Description: */
@Service
public class TestServiceImp implements TestService { 
   

    private static final Logger logger = LoggerFactory.getLogger(TestServiceImp.class);

    @Override
    public ReturnValue uploadFileTest(MultipartFile zipFile) {
        String targetFilePath = "D:\\test\\uploadTest";
        String fileName = UUID.randomUUID().toString().replace("-", "");
        File targetFile = new File(targetFilePath + File.separator + fileName);

        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(targetFile);
            IOUtils.copy(zipFile.getInputStream(), fileOutputStream);
            logger.info("------>>>>>>uploaded a file successfully!<<<<<<------");
        } catch (IOException e) {
            return new ReturnValue<>(-1, null);
        } finally {
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                logger.error("", e);
            }
        }
        return new ReturnValue<>(ReturnCodeAndMsgEnum.Success, null);
    }
}

说明:
1、targetFilePath为文件保存路径,本人用于测试所以指定路径,可根据实际情况进行修改。
2、fileName采用UUID生成,保证文件名唯一不重复,但是没有保留原文件后缀,可通过获取原文件文件名后,调用lastIndexOf(“.”)获取文件原后缀加上。
3、IOUtils为org.apache.commons.io.IOUtils,注意别导入错误。
4、本文中采用logback日志系统,可根据实际情况修改或删除。

附上ReturnValue以及ReturnCodeAndMsgEnum类,用于Controller层统一返回前端的model,如下:

package com.lanxuewei.utils.model;

import java.io.Serializable;

/** * @author lanxuewei Create in 2018/7/3 20:05 * Description: 统一web返回结果 */
public class ReturnValue<T> implements Serializable {
    private static final long serialVersionUID = -1959544190118740608L;
    private int ret;
    private String msg;
    private T data;

    public ReturnValue() {
        this.ret = 0;
        this.msg = "";
        this.data = null;
    }

    public ReturnValue(int retCode, String msg, T data) {
        this.ret = 0;
        this.msg = "";
        this.data = null;
        this.ret = retCode;
        this.data = data;
        this.msg = msg;
    }

    public ReturnValue(int retCode, String msg) {
        this.ret = 0;
        this.msg = "";
        this.data = null;
        this.ret = retCode;
        this.msg = msg;
    }

    public ReturnValue(ReturnCodeAndMsgEnum codeAndMsg) {
        this(codeAndMsg.getCode(), codeAndMsg.getMsg(), null);
    }

    public ReturnValue(ReturnCodeAndMsgEnum codeAndMsg, T data) {
        this(codeAndMsg.getCode(), codeAndMsg.getMsg(), data);
    }

    public int getRet() {
        return this.ret;
    }

    public void setRet(int ret) {
        this.ret = ret;
    }

    public String getMsg() {
        return this.msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return this.data;
    }

    public void setData(T data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "ReturnValue{" +
                "ret=" + ret +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
}
package com.lanxuewei.utils.model;

/** * @author lanxuewei Create in 2018/7/3 20:06 * Description: web相关接口返回状态枚举 */
public enum  ReturnCodeAndMsgEnum {
    Success(0, "ok"),
    No_Data(-1, "no data"),
    SYSTEM_ERROR(10004, "system error");

    private String msg;
    private int code;

    private ReturnCodeAndMsgEnum(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public static ReturnCodeAndMsgEnum getByCode(int code) {
        ReturnCodeAndMsgEnum[] var1 = values();
        int var2 = var1.length;

        for(int var3 = 0; var3 < var2; ++var3) {
            ReturnCodeAndMsgEnum aiTypeEnum = var1[var3];
            if (aiTypeEnum.code == code) {
                return aiTypeEnum;
            }
        }

        return Success;
    }

    public String getMsg() {
        return this.msg;
    }

    public int getCode() {
        return this.code;
    }
}

Postman发请求返回结果成功,以上代码只需要uploadFile一个参数即可。
这里写图片描述

注意事项: application.properties配置文件中可以配置文件上传相关属性,配置上传文件大小限制。
单个文件最大限制:spring.servlet.multipart.max-file-size=50Mb
单次请求最大限制:spring.servlet.multipart.max-request-size=70Mb

总结:本文功能较为简单,所以有些过程并没有更细致过程以及规范代码,比如存放路径采用项目路径,新文件名保持和原文件后缀一致等,需要的小伙伴可以根据自己业务进行修改。


续更,总觉得代码过于随意了,补充文件上传获得文件后缀相关函数

private String getFileSuffix(MultipartFile file) {
        if (file == null) {
            return null;
        }
        String fileName = file.getOriginalFilename();
        int suffixIndex = fileName.lastIndexOf(".");
        if (suffixIndex == -1) {    // 无后缀
            return null;
        } else {                    // 存在后缀
            return fileName.substring(suffixIndex, fileName.length());
        }
    }

在随机生成文件名后补充如下代码即可,如果返回文件后缀不为空则将其加入新产生的文件名中即可:

        String fileSuffix = getFileSuffix(zipFile);
        if (fileSuffix != null) {   // 拼接后缀
           fileName += fileSuffix;
        }
        File targetFile = new File(targetFilePath + File.separator + fileName);
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/131404.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • W3C标准及规范_地脚螺栓标准规范

    W3C标准及规范_地脚螺栓标准规范1.概念:W3C标准中文名:万维网联盟,外文名:WorldWideWebConsortium万维网联盟标准不是某一个标准,而是一些列标准的集合。网页主要有三部分组成:结构(Structure)、表现(Presentation)、行为(Behavior)。对应的标准也有三方面:结构化标准主要包括XHTML和XML,表现标准语言主要包括CSS、行为标准主要包括(如W3CDOM)、…

  • 常用的JS页面跳转代码调用大全

    常用的JS页面跳转代码调用大全一、常规的JS页面跳转代码1、在原来的窗体中直接跳转用<scripttype="text/javascript">window.location.href=&q

  • SM8S33、TVS瞬态抑制二极管在汽车上的问题与应用

    SM8S33、TVS瞬态抑制二极管在汽车上的问题与应用随着经济的发展,现代汽车工业也在的高速发展,汽车的电子化、数字化、自动化、通讯化、自动驾驶等相关模块的成为汽车行主流方向;于此同时系统之间的EMC电磁兼容就显得尤为重要,我们专门为电气化的设计提供了高效的保护方案与应用!汽车电源系统的应用:1.首先了解一下基本情况:虽然高浪涌电压是汽车电路保护系统的应对对象,但是也要注意钳位的电压高度。电源系统,12V与24V的电池在指定的环境下最大输出电压的值。常见的稳压器和DC-DC转换器IC的最大输入电压的值。EMC电磁问题的解决,汽车电子系统是干扰源复杂

  • maven打包时跳过测试「建议收藏」

    maven打包时跳过测试「建议收藏」开发记录有一个maven项目,我clone一下最新的代码。准备打包(mavenpackage),没想到在执行到TEST阶段报错。百思不得其解,决定跳过测试去打包,然后部署。Failedtoexecutegoalorg.apache.maven.plugins:maven-surefire-plugin:2.12.4:test在运行mvninstall或mvnpackag…

  • python猴子摘桃问题_python解决简单实际问题

    python猴子摘桃问题_python解决简单实际问题如何实现猴子摘香蕉问题,只需要几点即可1.猴子与箱子的位置关系2.箱子与香蕉的位置关系3.猴子有无摘到香蕉猴子摘到香蕉的前提条件1.猴子与箱子在一起2.箱子与香蕉在一起3.猴子在箱子上面4.猴子没有摘到香蕉猴子可能存在的几种位置状态1.箱子和猴子不在一起2.猴子跟箱子在一起且不跟香蕉在一起3.猴子不在箱子上并且猴子跟箱子在一起4.猴子在箱子上并且箱子跟香蕉在一起以及猴子没有摘取香蕉5.猴子在箱子上但箱子不跟香蕉在一起6.猴子取到香蕉根据上述开始

  • mvdr波束 matlab,mvdr波束形成matlab[通俗易懂]

    mvdr波束 matlab,mvdr波束形成matlab[通俗易懂]信息与通信工程学院阵列信号处理实验报告(自适应波束形成Matlab仿真)…同时研究了窄带信号的自适应波束形成的经典算法。研究并仿真了基于最小均方误差准则的LMS算法、RLS算法和MVDR自适应算法,并且做了一些比较。关键词:数字……MVDR算法matlab程序_计算机软件及应用_IT/计算机_专业资料。clc…根据期望信号的导向矢量,可以采取MVDR算法…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号