<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'