首页 专题 文章 代码 归档
SpringBoot上传文件
2020.03.13 21:12 2020.03.13 21:12

1. 上传文件

一般目前有两种方案:

1、上传至本地

2、上传至对象存储服务(如阿里的OSS、腾讯的COS)

2. 上传至本地

上传至本地,其实和SpringMVC一样的,并无太大区别!

可参考本站SpringMVC 上传文件的教程:https://www.misiai.com/tutorials/45.html


注意事项:

1、提交表单

<form action="/upload/doUpload" method="post" enctype="multipart/form-data">
    <input type="file" name="file" id="file"><br>
    <input type="submit" value="提交">
</form>

别忘了加入enctype属性!

2、可在配置文件设置上传大小的限制

spring:
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 50MB

3、Controller参考

package com.misiai.upload.controller;

import org.springframework.core.io.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

@Controller
@RequestMapping("upload")
public class UploadController {

    @GetMapping
    public String upload() {

        return "upload";
    }

    @PostMapping("/doUpload")
    public String doUpload(MultipartFile file, HttpSession session) {
        // file.transferTo();
        String originalFilename = file.getOriginalFilename();
        // 定义全局唯一名(伪):
        String unique = UUID.randomUUID().toString();

        String extension = null;
        if (originalFilename != null) {
            extension = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
        }

        // 全局文件名:
        String uniqueFileName = unique + "." + extension;
        System.out.println("uniqueFileName = " + uniqueFileName);

        try {
            file.transferTo(new File("D:\\" + uniqueFileName));
            System.out.println("上传成功");
        } catch (IOException e) {
            e.printStackTrace();
        }

        return "ok";
    }
}

3. 上传至OSS

OSS:阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。OSS可用于图片、音视频、日志等海量文件的存储。各种终端设备、Web网站程序、移动应用可以直接向OSS写入或读取数据。

OSS中几个概念:

  • Endpoint:访问域名,通过该域名可以访问OSS服务的API,进行文件上传、下载等操作。
  • Bucket:存储空间,是存储对象的容器,所有存储对象都必须隶属于某个存储空间。
  • Object:对象,对象是 OSS 存储数据的基本单元,也被称为 OSS 的文件。
  • AccessKey:访问密钥,指的是访问身份验证中用到的 AccessKeyId 和 AccessKeySecret。

3.1. 步骤1:导入jar包

导入jar包

<!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss -->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.8.1</version>
</dependency>

最新版本,请去这里:https://mvnrepository.com/artifact/com.aliyun.oss/

3.2. 步骤2:配置yml

# OSS相关配置信息
aliyun:
  oss:
    endpoint: oss-cn-hangzhou.aliyuncs.com # oss对外服务的访问域名
    url: https://oss-cn-hangzhou.aliyuncs.com/ #就是enpoint加上http协议,别忘了最后的/
    accessKeyId: test # 访问身份验证中用到用户标识
    accessKeySecret: test # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
    bucketName: name # oss的存储空间

上面的accessKeyIdaccessKeySecret可以去阿里云控制台找,不知道的百度一下就知道了;

上面的bucketNameendpoint去OSS的控制台找;

3.3. 步骤3:编写配置类

package com.misiai.upload.config;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

@Data
@Configuration
public class OSSConfig {

    @Value("${aliyun.oss.endpoint}")
    private String endPoint;

    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId;

    @Value("${aliyun.oss.url}")
    private String url;

    @Value("${aliyun.oss.accessKeySecret}")
    private String accessKeySecret;

    @Value("${aliyun.oss.bucketName}")
    private String bucketName;
}

解释:

这个配置类就是把application.yml配置的东西获取到罢了,顺带让spring托管;

3.4. 步骤4:编写工具类

package com.misiai.upload.util;

import com.aliyun.oss.ClientConfiguration;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.misiai.upload.config.OSSConfig;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.Objects;
import java.util.UUID;

public class OssUploadUtils {
    /**
     * oss 工具客户端
     */
    private volatile static OSSClient ossClient = null;

    public OssUploadUtils() {
    }

    /**
     * 上传文件至阿里云 OSS
     * 文件上传成功,返回文件完整访问路径
     * 文件上传失败,返回 null
     *
     * @param ossConfig oss 配置信息
     * @param file      待上传文件
     * @param fileDir   文件保存目录
     * @return oss 中的相对文件路径
     */
    public static String upload(OSSConfig ossConfig, MultipartFile file, String fileDir) {
        initOSS(ossConfig);
        StringBuilder fileUrl = new StringBuilder();
        try {
            String suffix = Objects.requireNonNull(file.getOriginalFilename()).substring(file.getOriginalFilename().lastIndexOf('.'));
            String fileName = System.currentTimeMillis() + "-" + UUID.randomUUID().toString().substring(0, 18) + suffix;
            if (!fileDir.endsWith("/")) {
                fileDir = fileDir.concat("/");
            }
            fileUrl.append(fileDir).append(fileName);

            ossClient.putObject(ossConfig.getBucketName(), fileUrl.toString(), file.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        fileUrl.insert(0, ossConfig.getUrl());
        return fileUrl.toString();
    }

    /**
     * 初始化 oss 客户端
     *
     * @param ossConfig
     * @return
     */
    private static OSSClient initOSS(OSSConfig ossConfig) {
        if (ossClient == null) {
            synchronized (OssUploadUtils.class) {
                if (ossClient == null) {
                    ossClient = new OSSClient(ossConfig.getEndPoint(),
                            new DefaultCredentialProvider(ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret()),
                            new ClientConfiguration());
                }
            }
        }
        return ossClient;
    }
}

解释:

上面的工具类其实就是封装了下官方jar包的操作,毕竟这是要复用的,肯定要封装成一个类;

initOSS方法,用于实例化(单例)ossClientossClient是官方sdk进行操作的通用的一个东西,具体可查看官方文档;

官方文档:https://help.aliyun.com/document_detail/32008.html


然后在控制器中,只需要调用该方法,即可:

@Autowired
private OSSConfig ossConfig;
@PostMapping("/oss")
public String uploadToOSS(MultipartFile file) {
    String upload = OssUploadUtils.upload(ossConfig, file, "test-java");
    System.out.println("upload = " + upload);
    return "ok";
}

上传成功:

截图-1584105144

本节阅读完毕! (分享
二维码图片 扫描关注我们哟