上传图片到阿里云OSS和获取上传图片的外网url的步骤
2021-05-14 16:29
标签:https auto sys ext import resign esc soft class 2.controller: 3.service 此处要把 4.上传的阿里云的帮助类OSSClientUtil 6.需要引入的jar包:gradle配置为: 上传图片到阿里云OSS和获取上传图片的外网url的步骤 标签:https auto sys ext import resign esc soft class 原文地址:https://www.cnblogs.com/xiangzideheiniu/p/11984063.html
"file"
name=
"file"
>
"submit"
value=
"提交"
>
@RequestMapping
(value =
"/headImgUpload.json"
, method = RequestMethod.POST)
@ResponseBody
public
Map
Map
new
HashMap
value.put(
"success"
,
true
);
value.put(
"errorCode"
,
0
);
value.put(
"errorMsg"
,
""
);
try
{
String head = userService.updateHead(file,
4
);
//此处是调用上传服务接口,4是需要更新的userId 测试数据。
value.put(
"data"
, head);
}
catch
(IOException e) {
e.printStackTrace();
value.put(
"success"
,
false
);
value.put(
"errorCode"
,
200
);
value.put(
"errorMsg"
,
"图片上传失败"
);
}
return
value;
}
@Autowired
private OSSClientUtil ossClient;注进来
@Override
public
String updateHead(MultipartFile file,
long
userId)
throws
IOException{
if
(file ==
null
|| file.getSize()
0
) {
throw
new
ImgException(
"头像不能为空"
);
}
String name = ossClient.uploadImg2Oss(file);
String imgUrl = ossClient.getImgUrl(name);
userDao.updateHead(userId, imgUrl);
//只是本地上传使用的
return
imgUrl;
}
import
java.io.*;
import
java.net.URL;
import
java.util.Date;
import
java.util.Random;
import
com.fndsoft.bcis.exception.ImgException;
import
org.apache.commons.logging.Log;
import
org.apache.commons.logging.LogFactory;
import
com.aliyun.oss.OSSClient;
import
com.aliyun.oss.model.ObjectMetadata;
import
com.aliyun.oss.model.PutObjectResult;
import
org.springframework.util.StringUtils;
import
org.springframework.web.multipart.MultipartFile;
/**
* 阿里云 OSS文件类
*
* @author YuanDuDu
*/
public
class
OSSClientUtil {
Log log = LogFactory.getLog(OSSClientUtil.
class
);
// endpoint以杭州为例,其它region请按实际情况填写
private
String endpoint =
"您的endpoint"
;
// accessKey
private
String accessKeyId =
"您的accessKeyId"
;
private
String accessKeySecret =
"您的accessKeySecret"
;
//空间
private
String bucketName =
"bcis"
;
//文件存储目录
private
String filedir =
"data/"
;
private
OSSClient ossClient;
public
OSSClientUtil() {
ossClient =
new
OSSClient(endpoint, accessKeyId, accessKeySecret);
}
/**
* 初始化
*/
public
void
init() {
ossClient =
new
OSSClient(endpoint, accessKeyId, accessKeySecret);
}
/**
* 销毁
*/
public
void
destory() {
ossClient.shutdown();
}
/**
* 上传图片
*
* @param url
*/
public
void
uploadImg2Oss(String url) {
File fileOnServer =
new
File(url);
FileInputStream fin;
try
{
fin =
new
FileInputStream(fileOnServer);
String[] split = url.split(
"/"
);
this
.uploadFile2OSS(fin, split[split.length -
1
]);
}
catch
(FileNotFoundException e) {
throw
new
ImgException(
"图片上传失败"
);
}
}
public
String uploadImg2Oss(MultipartFile file) {
if
(file.getSize() >
1024
*
1024
) {
throw
new
ImgException(
"上传图片大小不能超过1M!"
);
}
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;
}
catch
(Exception e) {
throw
new
ImgException(
"图片上传失败"
);
}
}
/**
* 获得图片路径
*
* @param fileUrl
* @return
*/
public
String getImgUrl(String fileUrl) {
if
(!StringUtils.isEmpty(fileUrl)) {
String[] split = fileUrl.split(
"/"
);
return
this
.getUrl(
this
.filedir + split[split.length -
1
]);
}
return
null
;
}
/**
* 上传到OSS服务器 如果同名文件会覆盖服务器上的
*
* @param instream 文件流
* @param fileName 文件名称 包括后缀名
* @return 出错返回"" ,唯一MD5数字签名
*/
public
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);
//上传文件
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;
}
/**
* Description: 判断OSS服务文件上传时文件的contentType
*
* @param FilenameExtension 文件后缀
* @return String
*/
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/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"
;
}
return
"image/jpeg"
;
}
/**
* 获得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
URL url = ossClient.generatePresignedUrl(bucketName, key, expiration);
if
(url !=
null
) {
return
url.toString();
}
return
null
;
}
}
compile ‘com.aliyun.oss:aliyun-sdk-oss:2.2.3‘