Springboot实现文件上传

实现图片上传服务,需要有存储的支持,那么我们的解决方案有以下几种:

1. 直接将图片保存到服务的硬盘
优点:开发便捷,成本低
缺点:扩容困难

2. 使用分布式文件系统进行存储(Minio  FastDFS)
优点:容易实现扩容
缺点:开发复杂度稍大

3. 使用第三方的存储服务(阿里云  华为云  七牛云)
优点:开发简单,拥有强大功能,免维护
缺点:付费

因此建议使用阿里云OSS来进行存储图片。

添加依赖



    com.aliyun.oss
    aliyun-sdk-oss
    3.10.2


    com.aliyun
    aliyun-java-sdk-core
    4.0.6

添加配置: application.yml

在配置文件application.yml中添加oss的配置 注意: 按照自己的阿里云配置修改
aliyun:
  oss:
    endpoint: xxxxx //区域
    accessKeyId: xxxxxxxx //秘钥key
    accessKeySecret: xxxxxxx //秘钥
    bucketName: xxxxx //存储空间
    url: xxxxx //访问域名

创建配置类: OssProperties

@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")//读取配置信息
public class OssProperties{
    private String endpoint; //区域
    private String accessKeyId;//秘钥key
    private String accessKeySecret;//秘钥
    private String bucketName;//存储空间
    private String url;//访问域名
}

创建工具类: OssTemplate

在项目中创建com.itheima.util.OssTemplate
package com.itheima.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.ObjectMetadata;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

//阿里存储工具类
@Component
public class OssTemplate {

    //注入配置参数实体类对象
    @Autowired
    private OssProperties ossProperties;
        
    //文件上传
    public String upload(String fileName, InputStream inputStream) {

        //创建客户端
        OSS ossClient = new OSSClientBuilder().build(ossProperties.getEndpoint(),
                ossProperties.getAccessKeyId(), ossProperties.getAccessKeySecret());

        //设置文件最终的路径和名称
        String objectName = "images/" + new SimpleDateFormat("yyyy/MM/dd").format(new Date())
                + "/" + System.currentTimeMillis() + fileName.substring(fileName.lastIndexOf("."));

        //meta设置请求头,解决访问图片地址直接下载
        ObjectMetadata meta = new ObjectMetadata();
        meta.setContentType(getContentType(fileName.substring(fileName.lastIndexOf("."))));

        //上传
        ossClient.putObject(ossProperties.getBucketName(), objectName, inputStream, meta);

        //关闭客户端
        ossClient.shutdown();

        return ossProperties.getUrl() + "/" + objectName;
    }

    //文件后缀处理
    private String getContentType(String FilenameExtension) {
        if (FilenameExtension.equalsIgnoreCase(".bmp")) {
            return "image/bmp";
        }
        if (FilenameExtension.equalsIgnoreCase(".gif")) {
            return "image/gif";
        }
        if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
                FilenameExtension.equalsIgnoreCase(".jpg") ||
                FilenameExtension.equalsIgnoreCase(".png")) {
            return "image/jpg";
        }
        return "image/jpg";
    }
}

测试

在测试类中进行测试com.itheima.test.OssTemplateTest
package com.itheima.test;

import com.itheima.util.OssTemplate;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

@SpringBootTest
@Slf4j
public class OssTemplateTest {
    @Autowired
    private OssTemplate ossTemplate;

    @Test
    public void testFileUpload() throws FileNotFoundException {
        String filePath = ossTemplate.upload("1.jpg", new FileInputStream("D:/upload/1.jpg"));
        log.info("文件上传完毕之后的路径{}", filePath);
    }
}

以上就是对于文件上传的一些配置类与测试案例源码。

你可能感兴趣的:(java)