JAVA后端实现文件上传,比如图片上床功能,有很多实现方案,可以将图片保存到服务器的硬盘上。也可以建立分布式集群,专门的微服务来存储文件常见的技术比如Minio。对于中小型公司,并且上传文件私密性不高的话可以使用第三方的存储服务,比如阿里云、华为云等。

阿里云官网地址:对象存储 OSS_云存储服务_企业数据管理_存储-阿里云阿里云对象存储 OSS 是一款海量、安全、低成本、高可靠的云存储服务,提供 99.995 % 的服务可用性和多种存储类型,适用于数据湖存储,数据迁移,企业数据管理,数据处理等多种场景,可对接多种计算分析平台,直接进行数据处理与分析,打破数据孤岛,优化存储成本,提升业务价值。文件上传-第三方服务阿里云OSS-LMLPHPhttps://www.aliyun.com/product/oss

一般入手第三方服务的学习,不要通读文档,可从官方的快速入门入手。将快速入门的代码粘一粘,看看哪些参数不应该写死应该抽取成工具类,哪些代码是核心的哪些代码可以省略,debug跑一下看看各个变量的值都是什么干什么用的

文件上传-第三方服务阿里云OSS-LMLPHP

利用阿里云OSS来存储文件,首先要在管理控制台上Bucket列表中建立自己的存储空间Bucket,填写好自己的Bucjet名称、地域等信息。并且创建好AccessKey秘钥的id和密码,后续需要将Bucjet名称、地域、AccessKey秘钥的id和密码的信息写到配置yml文件中,在将其注入到SpringIOC容器中。

使用阿里云,Java代码编写前,pom.xml中导入aliyun-sdk-oss和aliyun-java-sdk-core依赖。

代码的核心就是通过区域、密匙等信息创建ossClinet客户端,上传文件根据储存地址转成输入流inputstream,调用ossClient.putObject方法,传入参数Bucket桶的名称、图片上传后的名称、图片输入流,就可完成图片上传功能

这种像图片上传的共用的功能,我们会抽取为工具类,供大家使用。

Bucjet名称、地域、AccessKey秘钥的id和密码等信息为方便后续修改,应将其写到配置文件中,通过创建配置类将其读取,在工具类中将其注入并通过@Import注解将其放到IOC容器中。

oss:
  key: 密匙id
  secret: 密匙密码,都为自己创建的,在官网创建时记得保存
  endpoint: oss-cn-beijing.aliyuncs.com 区域地址,上述为北京区域
  bucket: 桶名字
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties(prefix = "oss")//读取配置信息
public class OssProperties {
    private String key; //密匙id
    private String secret;//秘钥密码
    private String endpoint;//区域地址
    private String bucket;//桶名
}

一般都可以用@ConfigurationProperties这个注解来读取配置文件中的信息,使用@Value配合EL表达式也可做到读取配置文件中的信息,但是上述更为常见简单。

紧接着抽取工具类即可,工具类中注入OssProperties对象,上标注@Component与
@Import(OssProperties.class)注解

//阿里存储工具类
@Component
@Import(OssProperties.class)//导入,相当于将OssProperties对象放入容器
public class OssTemplate {

    @Autowired
    private OssProperties ossProperties;

    //文件上传
    public String upload(String fileName, InputStream inputStream) {
        //根据上面叙述的参数创建客户端
        OSS ossClient = new OSSClientBuilder().build(ossProperties.getEndpoint(), ossProperties.getKey(), ossProperties.getSecret());

        //设置最终存储文件的路径和名称,自定义的,根据项目要求定义
        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.getBucket(), objectName, inputStream, meta);

        //关闭客户端
        ossClient.shutdown();
        //可通过下述地址访问到图片,可将地址存储到数据库中
        return "https://" + ossProperties.getBucket() + "." + ossProperties.getEndpoint() + "/" + objectName;
    }

    //文件后缀处理,比如文件叫1.jpg,下述方法抽取取得就是.jpg
    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";
    }
}

官网快速入门中的截图:

文件上传-第三方服务阿里云OSS-LMLPHP

图片上传大小默认是1M,太小了,需要修改,需修改配置文件

spring:
  servlet:
    multipart:
      max-request-size: 100MB # 最大请求文件大小,默认10MB
      max-file-size: 10MB # 单个请求文件大小,默认1MB

最后在应用代码中,写在controller层就可不必非写到service层,调用抽取的工具类ossTemplate.upload方法就可,注意参数接收文件类型为MultipartFile。

02-16 20:31