java中springBoot+oss基础使用-springboot集成mybatisplus的配置

2023-07-27 04:56:53

 

目的:储存一些图片和文件;

步骤:

1.整合jar包:有的使用的是3以上的版本,这个要看自己的springBoot版本

com.aliyun.ossaliyun-sdk-oss2.8.3

2.配置oss

3.工具类:

import com.aliyun.oss.OSSClient;import com.aliyun.oss.model.ObjectMetadata;import org.apache.commons.lang3.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;import java.io.IOException;import java.io.InputStream;/*** @author zhangtonghao *@create 2022-08-3016:26*/@Componentpublic class OSSUtil { private static Logger logger = LoggerFactory.getLogger(OSSUtil.class);// private OSSClient ossClient;@Value("${oss.endpoint.ext}") private String endpoint;@Value("${oss.endpoint.internal}") private String internalEndpoint;@Value("${oss.accessKeyId}") private String accessKeyId;@Value("${oss.accessKeySecret}") private String accessKeySecret;@Value("${oss.bucketName}") private String bucketName;/*** 上传文件到阿里云,并生成url ** @param filedir (key)文件名(不包括后缀)* @param in 文件字节流* @return String 生成的文件url */ public String uploadToAliyun(String filedir, InputStream in, String fileName, boolean isRandomName){ String suffix = fileName.substring(fileName.lastIndexOf(".")+ 1); if (isRandomName){ fileName = UUIDGenerator.generateCommonUUID()+ "."+ suffix;} logger.debug("------------>文件名称为:"+ fileName); OSSClient ossClient = new OSSClient(internalEndpoint, accessKeyId, accessKeySecret); String url = null; try {//创建上传Object的Metadata ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentLength(in.available()); objectMetadata.setCacheControl("no-cache");//设置Cache-Control请求头,表示用户指定的HTTP请求/回复链的缓存行为:不经过本地缓存 objectMetadata.setHeader("Pragma","no-cache");//设置页面不缓存 objectMetadata.setContentType(getcontentType(suffix)); objectMetadata.setContentDisposition("inline;filename="+ fileName);//上传文件 ossClient.putObject(bucketName, filedir +"/"+ fileName, in, objectMetadata); url = buildUrl(filedir +"/"+ fileName);} catch (IOException e){ logger.error("error", e);} finally { ossClient.shutdown(); try { if (in != null){ in.close();} } catch (IOException e){ logger.error("error", e);} } return url;} private String buildUrl(String fileDir){ StringBuffer url = new StringBuffer(); if (org.apache.commons.lang3.StringUtils.isEmpty(bucketName)){ logger.error("bucketName为空"); return null;} if (org.apache.commons.lang3.StringUtils.isEmpty(endpoint)){ logger.error("endpoint为空"); return null;} if (StringUtils.isEmpty(endpoint)){ logger.error("上传文件目录为空"); return null;} url.append("https://").append(bucketName).append(".").append(endpoint).append("/").append(fileDir); return url.toString();} /*** 删除图片* *@param key */ public void deletePicture(String key){ OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); ossClient.deleteObject(bucketName, key); ossClient.shutdown();} /*** Description:判断OSS服务文件上传时文件的contentType ** @param suffix 文件后缀* @return String HTTP Content-type */ public String getcontentType(String suffix){ if (suffix.equalsIgnoreCase("bmp")){ return "image/bmp";} else if (suffix.equalsIgnoreCase("gif")){ return "image/gif";} else if (suffix.equalsIgnoreCase("jpeg") suffix.equalsIgnoreCase("jpg")){ return "image/jpeg";} else if (suffix.equalsIgnoreCase("png")){ return "image/png";} else if (suffix.equalsIgnoreCase("html")){ return "text/html";} else if (suffix.equalsIgnoreCase("txt")){ return "text/plain";} else if (suffix.equalsIgnoreCase("vsd")){ return "application/vnd.visio";} else if (suffix.equalsIgnoreCase("pptx") suffix.equalsIgnoreCase("ppt")){ return "application/vnd.ms-powerpoint";} else if (suffix.equalsIgnoreCase("docx") suffix.equalsIgnoreCase("doc")){ return "application/msword";} else if (suffix.equalsIgnoreCase("xls") suffix.equalsIgnoreCase("xlsx")){ return "application/vnd.ms-excel";} else if (suffix.equalsIgnoreCase("xml")){ return "text/xml";} else if (suffix.equalsIgnoreCase("mp3")){ return "audio/mp3";} else if (suffix.equalsIgnoreCase("amr")){ return "audio/amr";} else if (suffix.equalsIgnoreCase("pdf")){ return "application/pdf";} else { return "text/plain";} }}

4.使用:

//注入oss工具类@Autowiredprivate OSSUtil ossUtil;/*** 授权文件上传* *@param file *@return */@PostMapping("/upload")public Result upload(@RequestParam("file") MultipartFile file){ if (file.isEmpty()){ return Result.error(ErrorCodeEnum.REQUESTAPIERROR.getCode(), ErrorCodeEnum.REQUESTAPIERROR.getMsg());} String fileName = file.getOriginalFilename(); String url = null; try { url = ossUtil.uploadToAliyun("card/img", new ByteArrayInputStream(file.getBytes()), fileName, true);} catch (IOException e){ logger.error("上传产品图片失败", e); return Result.error(ErrorCodeEnum.REQUESTAPIERROR.getCode(), ErrorCodeEnum.REQUESTAPIERROR.getMsg());} return Result.success(url);}

5.注意事项:下面有的会出现,但是我并没有

springboot会默认加载org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration这个类,

而DataSourceAutoConfiguration类使用了@Configuration注解向spring注入了dataSource bean,又因为项目(oss模块)中并没有关于dataSource相关的配置信息,所以当spring创建dataSource bean时因缺少相关的信息就会报错。

解决办法:

方法1、在@SpringBootApplication注解上加上exclude,解除自动加载DataSourceAutoConfiguration

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

6.延伸

一般的文章到上面就结束了,不过我这里还想加些实践的。

oss常用工具:oss-browser

相应的配置信息在配置中取即可,要注意的路径:oss://+bucketName

业务:一般我们上传的时候bucketName都是给好的,像一些什么没有bucketName还需要创建的其实都是多此一举,没有bucket直接找到运维同事创建一个即可。而在公司操作中大部分都是自己创建文件夹名称:比如传参中用户ID+设备id+文件属性+文件类型,其实就和redis创建key一样,网上的不要照抄,自己思考就好,下面例子可以供参考。

//生成文件keypublic String buildFileKey(String folder, String origFileName, Integer audioType, boolean isUseOrigFileName){ if (origFileName == null){ return null;} if (CommonConstants.AudioType.STAFF.equals(audioType) CommonConstants.AudioType.CUSTOMER.equals(audioType)){ folder = audioFolder +"/"+ folder;} else if (CommonConstants.AudioType.INSPECTION.equals(audioType)){ folder = inspectionFolder +"/"+ folder;} else if (CommonConstants.AudioType.MATERIAL.equals(audioType)){ folder = materialFolder +"/"+ folder;} String filePath = DateUtil.getNowDateString(); if (isUseOrigFileName){ String fileKey = folder +"/"+ filePath +"/"+ origFileName; logger.debug("file key:"+ fileKey); return fileKey;} int index = origFileName.lastIndexOf("."); String fileExtName = index >=0 ? origFileName.substring(index): ""; String fileName = java.util.UUID.randomUUID().toString().replaceAll("-",""); String fileKey = folder +"/"+ filePath +"/"+ fileName + fileExtName; return fileKey;}

/*** 创建文件名称* @param audioRecordVO *@return */private String buildFileKey(AudioRecordVO audioRecordVO){ StringBuffer fileName = new StringBuffer(); fileName.append(audioRecordVO.getStaffId()); fileName.append("-"); fileName.append(audioRecordVO.getAudioType()); fileName.append("-"); fileName.append(audioRecordVO.getDeviceId()); fileName.append("-"); fileName.append(DateUtil.formatTimeToString(audioRecordVO.getFileStartTime(), DateUtil.TIMEFORMATNOSPACE)); fileName.append("."); fileName.append(audioRecordVO.getFileType()); audioRecordVO.setFileName(aliyunStorageService.buildFileKey(appKey, fileName.toString(),audioRecordVO .getAudioType(), true)); return audioRecordVO.getFileName();}

创作不易,如果这篇文章对你有用,请点个赞谢谢()!


以上就是关于《java中springBoot+oss基础使用-springboot集成mybatisplus的配置》的全部内容,本文网址:https://www.7ca.cn/baike/55597.shtml,如对您有帮助可以分享给好友,谢谢。
标签:
声明

排行榜