使用SpringBoot如何上传图片到阿里云的OSS对象存储中?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
启动idea创建一个SpringBoot项目
将上面的步骤完成之后,点击下一步创建项目
创建完成之后修改pom.xml文件,添加阿里云oss依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency>
修改配置文件,将配置文件后缀名修改为yml类型的配置文件,并对阿里云oss进行参数的配置
server: port: 8088 # 阿里云存储参数配置 aliyun: oss: endpoint: accessKeyId: accessKeySecret: bucketName:
上面的参数我们首先进入阿里云官网,登录并进入自己的控制台
创建一个,方框中就是yml配置文件中的bucketName
点击进入就可以看见外网访问地址,将这个地址填写到yml配置文件中的endpoint
点击头像,选择AccessKey管理
选择继续使用AccessKey
创建一个AccessKey
创建成功,yml配置文件中的accessKeyId,accessKeySecret,对应填入相应位置
创建一个util(里面放oss工具类)文件夹,里面创建一个OssUtil的类。再创建一个Controller文件夹,里面创建一个OssController的文件
OssUtil类
package com.example.ossdemo.util; import com.aliyun.oss.OSSClient; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PutObjectResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.*; /** * 阿里云OSS服务器工具类 */ @Component public class OssUtil { //---------变量---------- protected static final Logger log = LoggerFactory.getLogger(OssUtil.class); @Value("${aliyun.oss.endpoint}") private String endpoint; @Value("${aliyun.oss.accessKeyId}") private String accessKeyId; @Value("${aliyun.oss.accessKeySecret}") private String accessKeySecret; @Value("${aliyun.oss.bucketName}") private String bucketName; //文件存储目录 private String filedir = "my_file/"; /** * 1、单个文件上传 * @param file * @return 返回完整URL地址 */ public String uploadFile(MultipartFile file) { String fileUrl = uploadImg2Oss(file); String str = getFileUrl(fileUrl); return str.trim(); } /** * 1、单个文件上传(指定文件名(带后缀)) * @param file * @return 返回完整URL地址 */ public String uploadFile(MultipartFile file,String fileName) { try { InputStream inputStream = file.getInputStream(); this.uploadFile2OSS(inputStream, fileName); return fileName; } catch (Exception e) { return "上传失败"; } } /** * 2、多文件上传 * @param fileList * @return 返回完整URL,逗号分隔 */ public String uploadFile(List<MultipartFile> fileList) { String fileUrl = ""; String str = ""; String photoUrl = ""; for(int i = 0;i< fileList.size();i++){ fileUrl = uploadImg2Oss(fileList.get(i)); str = getFileUrl(fileUrl); if(i == 0){ photoUrl = str; }else { photoUrl += "," + str; } } return photoUrl.trim(); } /** * 3、通过文件名获取文完整件路径 * @param fileUrl * @return 完整URL路径 */ public String getFileUrl(String fileUrl) { if (fileUrl !=null && fileUrl.length()>0) { String[] split = fileUrl.split("/"); String url = this.getUrl(this.filedir + split[split.length - 1]); return url; } return null; } //获取去掉参数的完整路径 private String getShortUrl(String url) { String[] imgUrls = url.split("\\?"); return imgUrls[0].trim(); } // 获得url链接 private String getUrl(String key) { // 设置URL过期时间为20年 3600l* 1000*24*365*20 Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 20); // 生成URL OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); URL url = ossClient.generatePresignedUrl(bucketName, key, expiration); if (url != null) { return getShortUrl(url.toString()); } return null; } // 上传文件 private String uploadImg2Oss(MultipartFile file) { //1、限制最大文件为20M if (file.getSize() > 1024 * 1024 *20) { return "图片太大"; } String fileName = file.getOriginalFilename(); String suffix = fileName.substring(fileName.lastIndexOf(".")).toLowerCase(); //文件后缀 String uuid = UUID.randomUUID().toString(); String name = uuid + suffix; try { InputStream inputStream = file.getInputStream(); this.uploadFile2OSS(inputStream, name); return name; } catch (Exception e) { return "上传失败"; } } // 上传文件(指定文件名) private String uploadFile2OSS(InputStream instream, String fileName) { String ret = ""; try { //创建上传Object的Metadata ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentLength(instream.available()); objectMetadata.setCacheControl("no-cache"); objectMetadata.setHeader("Pragma", "no-cache"); objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf(".")))); objectMetadata.setContentDisposition("inline;filename=" + fileName); //上传文件 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); PutObjectResult putResult = ossClient.putObject(bucketName, filedir + fileName, instream, objectMetadata); ret = putResult.getETag(); } catch (IOException e) { log.error(e.getMessage(), e); } finally { try { if (instream != null) { instream.close(); } } catch (IOException e) { e.printStackTrace(); } } return ret; } private static 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/jpeg"; } if (FilenameExtension.equalsIgnoreCase(".html")) { return "text/html"; } if (FilenameExtension.equalsIgnoreCase(".txt")) { return "text/plain"; } if (FilenameExtension.equalsIgnoreCase(".vsd")) { return "application/vnd.visio"; } if (FilenameExtension.equalsIgnoreCase(".pptx") || FilenameExtension.equalsIgnoreCase(".ppt")) { return "application/vnd.ms-powerpoint"; } if (FilenameExtension.equalsIgnoreCase(".docx") || FilenameExtension.equalsIgnoreCase(".doc")) { return "application/msword"; } if (FilenameExtension.equalsIgnoreCase(".xml")) { return "text/xml"; } //PDF if (FilenameExtension.equalsIgnoreCase(".pdf")) { return "application/pdf"; } return "image/jpeg"; } }
OssController类
package com.example.ossdemo.controller; import com.example.ossdemo.util.OssUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.util.HashMap; import java.util.Map; @RestController @RequestMapping("/oss") public class OssController { @Autowired OssUtil ossUtil; //注入OssUtil @PostMapping("/uploadfile") public Object fileUpload(@RequestParam("file") MultipartFile file) { try { String url = ossUtil.uploadFile(file); //调用OSS工具类 Map<String, Object> returnbody = new HashMap<>(); Map<String, Object> returnMap = new HashMap<>(); returnMap.put("url", url); returnbody.put("data",returnMap); returnbody.put("code","200"); returnbody.put("message","上传成功"); return returnbody; } catch (Exception e) { Map<String, Object> returnbody = new HashMap<>(); returnbody.put("data",null); returnbody.put("code","400"); returnbody.put("message","上传失败"); return returnbody; } } }
使用postman进行请求
这样就可以将文件上传到阿里云OSS啦
看完上述内容,你们掌握使用SpringBoot如何上传图片到阿里云的OSS对象存储中的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。