据我所知,图片存储并且可以返回图片路径,显示到前端的方法:
1.fastDFS + nginx的使用,前面博客有讲述,不再赘述。
2.上传本地服务器(file.transferTo(dest)),存在缺陷,例如项目肥大。不讲述。
3.今天的主题讲解使用阿里云的OSS服务器存取图片。
阿里云存储好用。
首先去阿里云(https://www.aliyun.com/?utm_content=se_1003074876)注册账号,并开通OSS,创建bucket、区域选最近的、自己玩就选低频访问、版本控制不开通、公共读,其他不需要。
创建完成后就会获得accessKeyId、accessKeySecret,
获取bucketName:打开bucket列表:Bucket 名称,就是
EndPoint(地域节点),点击bucketName进去就看得到
都是千年狐狸,就不再申请账号这里赘述了。
开始写!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1.把上述的属性配置到yml里面:
spring:
oss:
accessKeyId: xxxxxx
accessKeySecret: xxxxxx
bucketName:xxxxxx-sso
endpoint: oss-cn-chengdu.aliyuncs.com
servlet:
multipart:
max-file-size: 100MB
max-request-size: 1000MB
2.引入属性到代码里
@Value("${spring.oss.accessKeyId}")
private String accessKeyId;
@Value("${spring.oss.accessKeySecret}")
private String accessKeySecret;
@Value("${spring.oss.bucketName}")
private String bucketName;
@Value("${spring.oss.endpoint}")
private String endpoint;
上传
@RequestMapping("/upload")
public String upload(MultipartFile multpartFile) {
//创建了bucket下的目录这里指定上传到哪个目录下
String path = "liaochao/2020-03016/";
// 创建OSSClient的实例
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
if (ossClient.doesBucketExist(bucketName)) {
System.out.println("您已经创建Bucket:" + bucketName + "。");
} else {
System.out.println("您的Bucket不存在,创建Bucket:" + bucketName + "。");
// 创建Bucket。详细请参看“SDK手册 > Java-SDK > 管理Bucket”。
// 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_bucket.html?spm=5176.docoss/sdk/java-sdk/init
ossClient.createBucket(bucketName);
}
String fileName = null;
if (multpartFile.getSize() != 0 && !"".equalsIgnoreCase(multpartFile.getName())) {
ObjectMetadata om = new ObjectMetadata();
om.setContentLength(multpartFile.getSize());
//设置上传到服务器的名称
fileName = path + multpartFile.getOriginalFilename().toLowerCase();
System.out.println("我是objectName==========================" + fileName);
om.addUserMetadata("filename", fileName);
try {
ossClient.putObject(bucketName, fileName, new ByteArrayInputStream(multpartFile.getBytes()), om);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != ossClient) {
ossClient.shutdown();
}
}
}
//设置文件的有效时间
Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);
String url = ossClient.generatePresignedUrl(bucketName, fileName, expiration).toString();
return url;
}
下载
这里有坑:OSSObject ossObject = ossClient.getObject(bucketName, fileName);里面的fileName是文件名称,是上面返回的完整路径中的aliyuncs.com/后面的知道?前面的那串!!!
如果是清楚可以点开阿里云上的图片,详情,下面的文件名就是这里的fileName,,,上传成功往数据库写文件名,注意截取!!
给前端展示的话返回:http://liaochao-sso.oss-cn-chengdu.aliyuncs.com/liaochao/2020-03016/xxx.jpg
就可以展示,不需要问号? 后面的东西
@GetMapping("/download")
public void download(String fileName, HttpServletResponse response) throws Exception {
if (null == fileName) {
log.info("文件名不能为空!");
return;
}
BufferedOutputStream out = null;
BufferedInputStream in = null;
OSS ossClient = null;
try {
out = new BufferedOutputStream(response.getOutputStream());
ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// <yourObjectName>表示上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg
//liaochao/2020-03016/203fb80e7bec54e78d4aeaebb9389b504ec26aa5.jpg
OSSObject ossObject = ossClient.getObject(bucketName, fileName);
in = new BufferedInputStream(ossObject.getObjectContent());
response.setHeader("Content-Disposition", "attachment;fileName=" + new String(fileName.getBytes(), "iso-8859-1"));
byte[] buffer = new byte[in.available()];
int L = 0;
while ((L = in.read(buffer)) != -1) {
out.write(buffer, 0, L);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != in) {
in.close();
}
if (out != null) {
out.close();
}
if (null != ossClient) {
ossClient.shutdown();
}
}
}
删除
fileName与删除那里一样是.com后面与?之间的部分
@RequestMapping("/delete")
public String delete(String fileName) {
log.info("………delete………start……");
OSS ossClient = null;
try {
ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ossClient.deleteObject(bucketName, fileName);
} catch (Exception e) {
e.printStackTrace();
return "删除失败!";
} finally {
if (null == ossClient) {
ossClient.shutdown();
}
}
return "删除成功!";
}
=springcloudAlibaba中的使用==============
①导包
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alicloud-oss</artifactId>
</dependency>
② 配置yml文件
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://192.168.61.147:3306/gulimall_pms?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
alicloud:
access-key: LTAI4G6CU6v5W3GKVmxxxxxxx
secret-key: SZK8XVd54hIF6qGNHsxxxxxxxx
oss:
endpoint: http://oss-cn-chengdu.aliyuncs.com
其实只是配置了access-key、secret-key、endpoint 3个参数
③代码,比直接用aliyun-sdk-oss少一点而已
InputStream inputStream = new FileInputStream("C:\\Users\\Admin\\Desktop\\cc\\新建文件夹\\凉山那些年\\9.jpg");
//指定文件夹
String path = "cc/2020-03016/";
String fileName = path+"9.jpg";
//cc-sso对用哪一个bucket,若要配置路径在path 里面配置
ossClient.putObject("cc-sso", fileName, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
System.out.println("success");
是不是简单易懂易用