Java 干货公众号粉丝福利,技术 leader 教你如何将图片保存到 OSS
新入职实习生小二,带着热忱与迷茫踏入职场,开启了技术实习之旅。我受命向他传授一项看似简单的任务——将前端编辑器上传的图片存储至服务器。出乎意料的是,他径直将图片存储于服务器。此举令我不禁懊恼,亦引发深思:在当前技术环境下,是否仍有同行直接存储图像于服务器?正确做法应是选用OSS或MinIO等对象存储服务。
小二的初体验:直接保存图片到服务器
初级阶段,操作员直接将客户端提交的图像存入服务器。尽管此方法简便,却显露出其对存储技术的理解局限。在网络架构现状下,将图像直接存入服务器,不仅效率欠佳且管理繁重。服务器应专注于执行业务逻辑,而非海量静态内容的存储。此情况表明,该操作员迫切需要更多专业指导和知识积累。
导师的无奈与指导:从服务器到OSS
在审阅小二作业时,我感到愤怒与沮丧。作业未能达到现代技术标准,引发了我的不满;考虑到他是新入行者,学习曲线漫长,我感到无力。因此,我决定亲自指导,逐步讲解从图片到对象存储服务(OSS)的存储步骤。OSS是阿里云提供的高效、安全存储方案。通过采用OSS,我们能在云端有效保存静态资源,既提高了存储效率,又极大地简化了管理流程。
小二的转变:从懵懂到自信
在本指导下,小二逐步在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,最终生成了可供前端访问的图片链接。此过程的顺利进行提升了小二对操作方法的信心。
外链转链:从外链到OSS
对OSS系统综合集成完毕后,小二对外部链接转换功能进行了详尽测试。他在Java类中拓展了图片转换至外部链接的功能,通过正则表达式识别文档链接,并保存在OSS。随后,他将图片替换至原链接。Web管理端验证确认,该转换过程流畅,图片显示正常。
总结与展望:从实习到成长
在本次OSS集成项目中,小二不仅熟练掌握了将图像上传至OSS的操作,且精通了相关技术流程。面对挑战,其显著进步不言而喻。尽管OSS与CDN是理想的图床组合,阿里云HTTPSCDN在个别情况下存在回源故障,影响图片展示,这一缺陷亟待改进。然而,此次实践活动对小二的技术发展至关重要。
作者:小蓝
链接:https://www.lanmiyun.com/content/2710.html
本站部分内容和图片来源网络,不代表本站观点,如有侵权,可联系我方删除。