Java 干货公众号粉丝福利,技术 leader 教你如何将图片保存到 OSS

新入职实习生小二,带着热忱与迷茫踏入职场,开启了技术实习之旅。我受命向他传授一项看似简单的任务——将前端编辑器上传的图片存储至服务器。出乎意料的是,他径直将图片存储于服务器。此举令我不禁懊恼,亦引发深思:在当前技术环境下,是否仍有同行直接存储图像于服务器?正确做法应是选用OSS或MinIO等对象存储服务。

Java 干货公众号粉丝福利,技术 leader 教你如何将图片保存到 OSS插图

小二的初体验:直接保存图片到服务器

初级阶段,操作员直接将客户端提交的图像存入服务器。尽管此方法简便,却显露出其对存储技术的理解局限。在网络架构现状下,将图像直接存入服务器,不仅效率欠佳且管理繁重。服务器应专注于执行业务逻辑,而非海量静态内容的存储。此情况表明,该操作员迫切需要更多专业指导和知识积累。

导师的无奈与指导:从服务器到OSS

在审阅小二作业时,我感到愤怒与沮丧。作业未能达到现代技术标准,引发了我的不满;考虑到他是新入行者,学习曲线漫长,我感到无力。因此,我决定亲自指导,逐步讲解从图片到对象存储服务(OSS)的存储步骤。OSS是阿里云提供的高效、安全存储方案。通过采用OSS,我们能在云端有效保存静态资源,既提高了存储效率,又极大地简化了管理流程。

Java 干货公众号粉丝福利,技术 leader 教你如何将图片保存到 OSS插图1

小二的转变:从懵懂到自信

在本指导下,小二逐步在SpringBoot应用中集成OSS服务。通过阿里云官网,他以“OSS”为关键词搜索相关信息。随后,创建了新的OSS存储容器,并配置了公开读权限,以便互联网用户浏览内部图片。尽管初期操作略显新手,但小二展现出强烈的学习意愿和良好的适应性。



    com.aliyun.oss
    aliyun-sdk-oss
    3.10.2

OSS的整合:从配置到上传

aliyun:
  oss:
      # oss对外服务的访问域名
    endpoint: oss-cn-beijing.aliyuncs.com
      # 访问身份验证中用到用户标识
    accessKeyId: LTAI5
      # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
    accessKeySecret: RYN
      # oss的存储空间
    bucketName: itwanger-oss1
      # 上传文件大小(M)
    maxSize: 3
      # 上传文件夹路径前缀
    dir:
      prefix: codingmore/images/

在部署集成对象存储服务(OSS)流程之际,工程师首步运用Java配置类引入@Value注解,以此从配置文件中提取OSS配置数据。随后,工程师编写服务层代码,确保了文件向OSS的上传功能及其存储路径的提供。尽管过程复杂,工程师仍高效操作,顺利将图片上传至OSS平台。

@Configuration
public class OssClientConfig {
    @Value("${aliyun.oss.endpoint}")
    String endpoint ;
    @Value("${aliyun.oss.accessKeyId}")
    String accessKeyId ;
    @Value("${aliyun.oss.accessKeySecret}")
    String accessKeySecret;

    @Bean
    public OSSClient createOssClient() {
        return (OSSClient)new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    }
}

测试与验证:从上传到确认

@Controller
@Api(tags = "上传")
@RequestMapping("/ossController")
public class OssController {
    @Autowired
    private IOssService ossService;

    @RequestMapping(value = "/upload",method=RequestMethod.POST)
    @ResponseBody
    @ApiOperation("上传")
    public ResultObject upload(@RequestParam("file") MultipartFile file, HttpServletRequest req)  {
        return ResultObject.success(ossService.upload(file));
    }
}

完成OSS集成任务后,小二采用Postman对上传接口进行了细致检验,验证图片上传无误并获取了正确链接。随后,团队访问阿里云OSS控制台核实图片成功上传。这些检验步骤提升了小二的操作自信,同时展现了其技能的提升。

前端测试:从上传到显示

@Service
public class OssServiceImpl implements IOssService{

    @Value("${aliyun.oss.maxSize}")
    private int maxSize;
   
    @Value("${aliyun.oss.bucketName}")
    private String bucketName;
  
    @Value("${aliyun.oss.dir.prefix}")
    private String dirPrefix;
    
    @Autowired
    private OSSClient ossClient;   
    @Override
    public String upload(MultipartFile file) {
        try {
            return upload(file.getInputStream(), file.getOriginalFilename());
        } catch (IOException e) {
            LOGGER.error(e.getMessage());
        }
        return null;
    }

    @Override
    public String upload(InputStream inputStream,String name) {
        String objectName = getBucketName(name);
        // 创建PutObject请求。
        ossClient.putObject(bucketName, objectName, inputStream);
        return formatPath(objectName);
    }
    private String getBucketName(String url){
        String ext = "";
        for(String extItem:imageExtension){
            if(url.indexOf(extItem) != -1){
                ext = extItem;
                break;
            }
        }
        return dirPrefix+ DateUtil.today()+"/"+ IdUtil.randomUUID()+ext;
    }

    private String formatPath(String objectName){
        return "https://"  +bucketName+"."+ ossClient.getEndpoint().getHost() + "/" + objectName;
    }
}  

为了全面评估开放源代码系统(OSS)的集成效益,小二顺利下载并激活了前端脚本及Web管理界面。在内容编辑过程中,他选择并上传了图片,验证了图片从前端至服务器的顺畅传输,经服务器处理后再上传至OSS,最终生成了可供前端访问的图片链接。此过程的顺利进行提升了小二对操作方法的信心。

Java 干货公众号粉丝福利,技术 leader 教你如何将图片保存到 OSS插图2

外链转链:从外链到OSS

对OSS系统综合集成完毕后,小二对外部链接转换功能进行了详尽测试。他在Java类中拓展了图片转换至外部链接的功能,通过正则表达式识别文档链接,并保存在OSS。随后,他将图片替换至原链接。Web管理端验证确认,该转换过程流畅,图片显示正常。

Java 干货公众号粉丝福利,技术 leader 教你如何将图片保存到 OSS插图3

总结与展望:从实习到成长

在本次OSS集成项目中,小二不仅熟练掌握了将图像上传至OSS的操作,且精通了相关技术流程。面对挑战,其显著进步不言而喻。尽管OSS与CDN是理想的图床组合,阿里云HTTPSCDN在个别情况下存在回源故障,影响图片展示,这一缺陷亟待改进。然而,此次实践活动对小二的技术发展至关重要。

THE END