2024.7.14
一、阿里云的上传(下载我直接点地址直接下载了,明天找前端试试,能不能把访问网页当成下载试试)
1. 首先我们需要在阿里云上开通阿里云对象存储。
这些,网上很多,最后的网页里也有,如果要从头看的话,建议看一下原文。
2. 引入官方依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.8.3</version>
</dependency>
3. 然后就是application.yml的配置:
aliyun:
oss:
endpoint: 阿里云OSS地址,这里看根据你的oss选择
accessKeyId: 阿里云OSS账号
accessKeySecret: 阿里云OSS密钥
bucketName: 阿里云OSS上的存储块bucket名字
filedir: 阿里云图片文件存储目录
max-file-size: 10MB
max-request-size: 20MB
4. oss工具类的编写(包含了多照片和单照片,代码复制就能用!)
package com.hengyin.ship.config;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;
import java.util.List;
import java.util.Random;
@Component
public class OssUtil {
//阿里云OSS地址,这里看根据你的oss选择
@Value("${aliyun.oss.endpoint}")
private String endpoint;
//阿里云OSS账号
@Value("${aliyun.oss.accessKeyId}")
private String accessKeyId;
//阿里云OSS密钥
@Value("${aliyun.oss.accessKeySecret}")
private String accessKeySecret;
//阿里云OSS上的存储块bucket名字
@Value("${aliyun.oss.bucketName}")
private String bucketName;
//阿里云图片文件存储目录
@Value("${aliyun.oss.filedir}")
private String filedir;
/**
* 上传图片
* @param file
* @return 图片的路径
*/
public String uploadImg2Oss(MultipartFile file) {
if (file.getSize() > 1024 * 1024 *20) { //20M
return "图片太大";
}
String originalFilename = file.getOriginalFilename();
String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
Random random = new Random();
String name = random.nextInt(10000) + System.currentTimeMillis() + substring;
try {
InputStream inputStream = file.getInputStream();
this.uploadFile2OSS(inputStream, name);
return name;//RestResultGenerator.createSuccessResult(name);
} catch (Exception e) {
return "上传失败";
}
}
/**
* 上传图片获取fileUrl
* @param instream
* @param fileName
* @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) {
e.getMessage();
} finally {
try {
if (instream != null) {
instream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return ret;
}
public 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/jpg";
}
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";
}
return "image/jpg";
}
/**
* 获取图片路径
* @param fileUrl
* @return
*/
public String getImgUrl(String fileUrl) {
if (!StringUtils.isEmpty(fileUrl)) {
String[] split = fileUrl.split("/");
String url = this.getUrl(this.filedir + split[split.length - 1]);
// log.info(url);
String[] spilt1 = url.split("\\?");
return spilt1[0];
// return url;
}
return null;
}
/**
* 获得url链接
*
* @param key
* @return
*/
public String getUrl(String key) {
// 设置URL过期时间为10年 3600l* 1000*24*365*10
Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 10);
// 生成URL
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
URL url = ossClient.generatePresignedUrl(bucketName, key, expiration);
if (url != null) {
return url.toString();
}
return null;
}
/**
* 多图片上传
* @param fileList
* @return
*/
public String checkList(List<MultipartFile> fileList) {
String fileUrl = "";
String str = "";
String photoUrl = "";
for(int i = 0;i< fileList.size();i++){
fileUrl = uploadImg2Oss(fileList.get(i));
str = getImgUrl(fileUrl);
if(i == 0){
photoUrl = str;
}else {
photoUrl += "," + str;
}
}
return photoUrl.trim();
}
/**
* 单个图片上传
* @param file
* @return
*/
public String checkImage(MultipartFile file){
String fileUrl = uploadImg2Oss(file);
String str = getImgUrl(fileUrl);
return str.trim();
}
}
5. 编写一个controller测试:
package com.hengyin.ship.controller;
import com.hengyin.ship.config.OssUtil;
import com.hengyin.ship.service.FileService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/ship/oss")
public class FileApiController {
@Autowired
private FileService fileService;
@Autowired
private OssUtil ossUtil;
@PostMapping("/homeImageUpload")
@ResponseBody
public String homeImageUpload(@RequestParam("file")MultipartFile file) {
try {
String homeImage = ossUtil.checkImage(file);//此处是调用上传服务接口
return homeImage;
}catch (Exception e) {
e.printStackTrace();
return e.toString();
}
}
}
6. 通过ApiFox上传(上传文件)
7. 返回文件的url
你们也可以看看狗狗
https://sky-fstcast.oss-cn-beijing.aliyuncs.com/2024/1720929004892.jpg
8. 对于访问地址会自动下载的问题:(我是需要直接下载的,所以我就不改了)
文件正常上传,但是返回的地址无法直接访问,一打开就是下载。
经过百度,出现各种方法,比如映射自己的域名、添加Content-Disposition inline 关键字。标题所示,这个方法不用申请域名,并且不用设置 HTTP头。首先出现让直接下载的情况,怀疑是因为Content-Type = image/jpeg 如果换为 image/jpg 则可以直接预览。
所以解决方法为 代码中设置 Content-Type
原文链接:
https://blog.csdn.net/JGYBZX_G/article/details/111480067
二、在pom里面无法加载依赖的问题:
这个问题在我看尚硅谷的springcloud课的时候遇到了,当时解决了,现在又遇到了,我给忘了,真该死啊,所以,记下来。
三、又遇到了Java的jdk21和Lombok的版本冲突问题:
因为小组的jdk版本不高,我看着还有,”你升任你升,老子Java8“,然后开始解决这个问题,这个问题最早也出现在尚硅谷的cloud的学习,然后解决方式就是:
JDK 21的报错NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid’通常涉及到Lombok库版本与Java编译器之间的兼容性问题。最近的Lombok版本通常会修复旧版本中的错误,因此你可以尝试升级Lombok版本来解决这个问题。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version> <!-- 将版本号更新为最新版本 -->
</dependency>
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_29901385/article/details/134410408