<form action=
"/bcis/api/headImgUpload.json"
method=
"post"
enctype=
"multipart/form-data"
>
<input type=
"file"
name=
"file"
>
<input type=
"submit"
value=
"提交"
>
</form>
|
2.controller:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
@RequestMapping
(value =
"/headImgUpload.json"
, method = RequestMethod.POST)
@ResponseBody
public
Map<String, Object> headImgUpload(HttpServletRequest request,MultipartFile file) {
Map<String, Object> value =
new
HashMap<String, Object>();
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;
}
|
3.service 此处要把
@Autowired
private OSSClientUtil ossClient;注进来
1
2
3
4
5
6
7
8
9
10
|
@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;
}
|
4.上传的阿里云的帮助类OSSClientUtil
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
|
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
;
}
}
|
6.需要引入的jar包:gradle配置为:
compile 'com.aliyun.oss:aliyun-sdk-oss:2.2.3'