阿里oss怎麼配置
A. oss上傳速度跟伺服器有關系嗎
以下代碼使用分片上傳的方式,可有效解決,OSS文件上傳緩慢問題,但如果伺服器的寬頻過低還是會影響上傳速度,可將伺服器寬頻提高,以提升速度
1.引入POM
<!--阿里雲OSS-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.9.1</version>
</dependency>
1
2
3
4
5
6
7
1
2
3
4
5
6
7
2.編寫文件上傳工具類
import com.alibaba.fastjson.JSONObject;
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* 文件上傳工具類
*/
public class FilesUploadUtil {
/**
* 獲取上傳結果
* @param newFile 上傳文件
* @param folder 父級文件夾名稱
* @return 文件訪問路徑
*/
public static JSONObject obtainTheFileUploadResult(MultipartFile newFile, String folder){
JSONObject result=new JSONObject();
JSONObject data=new JSONObject();
long startTime = System.currentTimeMillis();
try {
// MultipartFile 轉 File
File file=multipartFileToFile(newFile);
//上傳文件
String[] resultArr = uploadObject2OSS(file, folder);
if (resultArr != null) {
String path = resultArr[1];
//絕對路徑,拼接CND加速域名,或自己的域名
data.put("src", "自己的公網IP".concat("/").concat(path));
//相對路徑
data.put("relativePath", path);
result.put("msg", 1);
result.put("errorMessage", null);
}
// 刪除本地臨時文件
deleteTempFile(file);
} catch (RuntimeException e) {
e.printStackTrace();
result.put("msg", 0);
result.put("errorMessage", "文件大小不能超過9.7G");
data.put("src", null);
data.put("relativePath", null);
}catch (Exception e) {
result.put("msg", 0);
result.put("errorMessage", "上傳錯誤:"+e.getMessage());
data.put("src", null);
data.put("relativePath", null);
}
result.put("data",data);
long endTime = System.currentTimeMillis();
System.out.println("------文件上傳成功,耗時" + ((endTime - startTime) / 1000) + "s------");
return result;
}
/**
* 上傳圖片至OSS 文件流
*
* @param file 上傳文件(文件全路徑如:D:\\image\\cake.jpg)
* @param folder 阿里雲API的文件夾名稱(父文件夾)
* @return String 返回的唯一MD5數字簽名
*/
public static String[] uploadObject2OSS(File file,String folder) throws Exception{
//獲取OSS客戶端對象
OSS ossClient=getOSSClient();
//OOS 桶名稱 bucketName
String bucketName="自己阿里雲的bucketName";
// 阿里OSS
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
Date date = new Date();
// 阿里雲API的文件夾名稱(子文件夾)
String format = dateFormat.format(date) + "/";
// 文件名
String formats =String.valueOf(UUID.randomUUID());
// 創建一個可重用固定線程數的線程池
ExecutorService executorService = Executors.newFixedThreadPool(5);
String[] resultArr = new String[2];
try {
// 分片上傳
folder =folder +"/"+ format;
// 文件名
String fileName = file.getName();
// 文件擴展名
String fileExtension = fileName.substring(fileName.lastIndexOf("."));
// 最終文件名:UUID + 文件擴展名
fileName = formats + fileExtension;
// 上傳路徑 如:appversion/20200723/a3662009-897c-43ea-a6d8-466ab8310c6b.apk
// objectName表示上傳文件到OSS時需要指定包含文件後綴在內的完整路徑,例如abc/efg/123.jpg
String objectName = folder + fileName;
System.out.println("文件路徑--》》"+objectName);
// 文件大小
long fileSize = file.length();
// 創建上傳Object的Metadata
ObjectMetadata metadata = new ObjectMetadata();
// 指定該Object被下載時的網頁的緩存行為
metadata.setCacheControl("no-cache");
// 指定該Object下設置Header
metadata.setHeader("Pragma", "no-cache");
// 指定該Object被下載時的內容編碼格式
metadata.setContentEncoding("utf-8");
// 文件的MIME,定義文件的類型及網頁編碼,決定瀏覽器將以什麼形式、什麼編碼讀取文件。如果用戶沒有指定則根據Key或文件名的擴展名生成,
// 如果沒有擴展名則填默認值application/octet-stream
metadata.setContentType(getContentType(fileExtension));
// 指定該Object被下載時的名稱(指示MINME用戶代理如何顯示附加的文件,打開或下載,及文件名稱)
metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");
// 創建對象
request = new (bucketName, objectName, metadata);
// 初始化分片
InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request);
// 返回uploadId,它是分片上傳事件的唯一標識,您可以根據這個uploadId發起相關的操作,如取消分片上傳、查詢分片上傳等
String uploadId = upresult.getUploadId();
// partETags是PartETag的集合。PartETag由分片的ETag和分片號組成
List<PartETag> partETags = Collections.synchronizedList(new ArrayList<>());
// 計算文件有多少個分片
final long partSize = 1 * 1024 * 1024L; // 1MB
long fileLength = file.length();
int partCount = (int) (fileLength / partSize);
if (fileLength % partSize != 0) {
partCount++;
}
if (partCount > 10000) {
throw new RuntimeException("文件過大");
}
// 遍歷分片上傳
for (int i = 0; i < partCount; i++) {
long startPos = i * partSize;
long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
int partNumber = i + 1;
// 實現並啟動線程
executorService.execute(new Runnable() {
@Override
public void run() {
InputStream inputStream = null;
try {
inputStream = new FileInputStream(file);
// 跳過已經上傳的分片
inputStream.skip(startPos);
UploadPartRequest uploadPartRequest = new UploadPartRequest();
uploadPartRequest.setBucketName(bucketName);
uploadPartRequest.setKey(objectName);
uploadPartRequest.setUploadId(uploadId);
uploadPartRequest.setInputStream(inputStream);
// 設置分片大小。除了最後一個分片沒有大小限制,其他的分片最小為100 KB。
uploadPartRequest.setPartSize(curPartSize);
// 設置分片號。每一個上傳的分片都有一個分片號,取值范圍是1~10000,如果超出這個范圍,OSS將返回InvalidArgument的錯誤碼。
uploadPartRequest.setPartNumber(partNumber);
// 每個分片不需要按順序上傳,甚至可以在不同客戶端上傳,OSS會按照分片號排序組成完整的文件。
UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
//每次上傳分片之後,OSS的返回結果會包含一個PartETag。PartETag將被保存到PartETags中。
synchronized (partETags) {
partETags.add(uploadPartResult.getPartETag());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
});
}
// 等待所有的分片完成
// shutdown方法:通知各個任務(Runnable)的運行結束
executorService.shutdown();
while (!executorService.isTerminated()) {
try {
// 指定的時間內所有的任務都結束的時候,返回true,反之返回false,返回false還有執行完的任務
executorService.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
}
// 立即關閉所有執行中的線程
// executorService.shutdownNow();
// 驗證是否所有的分片都完成
if (partETags.size() != partCount) {
throw new IllegalStateException("文件的某些部分上傳失敗!");
}
// 完成分片上傳 進行排序。partETags必須按分片號升序排列
Collections.sort(partETags, new Comparator<PartETag>() {
@Override
public int compare(PartETag o1, PartETag o2) {
return o1.getPartNumber() - o2.getPartNumber();
}
});
// 創建對象
// 在執行完成分片上傳操作時,需要提供所有有效的partETags。OSS收到提交的partETags後,會逐一驗證每個分片的有效性。當所有的數據分片驗證通過後,OSS將把這些分片組合成一個完整的文件
= new (bucketName, objectName, uploadId, partETags);
// 設置文件訪問許可權
// .setObjectACL(CannedAccessControlList.PublicRead);
// 完成上傳
CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload();
if (completeMultipartUploadResult != null) {
// 解析結果
resultArr[0] = completeMultipartUploadResult.getETag();
resultArr[1] = objectName;
return resultArr;
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("上傳阿里雲OSS伺服器異常." + e.getMessage());
} finally {
// 關閉OSSClient
ossClient.shutdown();
}
return null;
}
/**
* MultipartFile 轉 File
*
* @param file
* @throws Exception
*/
public static File multipartFileToFile(MultipartFile file) {
try {
File toFile;
if (file != null && file.getSize() > 0) {
InputStream ins = null;
ins = file.getInputStream();
toFile = new File(file.getOriginalFilename());
inputStreamToFile(ins, toFile);
ins.close();
return toFile;
}
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
/**
* 獲取流文件
*
* @param ins
* @param file
*/
public static void inputStreamToFile(InputStream ins, File file) {
try {
OutputStream os = new FileOutputStream(file);
int bytesRead;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 獲取阿里雲OSS客戶端對象
*
* @return ossClient
*/
public static OSS getOSSClient() {
ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
// 連接空閑超時時間,超時則關閉
conf.setIdleConnectionTime(1000);
return new OSSClientBuilder().build("自己阿里雲的endpoint", "自己阿里雲的access_key_id", "自己阿里雲的access_key_secret", conf);
}
/**
* 獲得url鏈接
*
* @param bucketName 桶名稱
* @param key Bucket下的文件的路徑名+文件名 如:"appversion/20200723/a3662009-897c-43ea-a6d8-466ab8310c6b.apk"
* @return 圖片鏈接:http://xxxxx.oss-cn-beijing.aliyuncs.com/test/headImage/1546404670068899.jpg?Expires=1861774699&OSSAccessKeyId=****=p%2BuzEEp%2F3JzcHzm%2FtAYA9U5JM4I%3D
* (Expires=1861774699&OSSAccessKeyId=LTAISWCu15mkrjRw&Signature=p%2BuzEEp%2F3JzcHzm%2FtAYA9U5JM4I%3D 分別為:有前期、keyID、簽名)
*/
public static String getUrl(String bucketName, String key) {
// 設置URL過期時間為10年 3600L*1000*24*365*10
Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);
OSS ossClient = getOSSClient();
// 生成URL
URL url = ossClient.generatePresignedUrl(bucketName, key, expiration);
return url.toString().substring(0, url.toString().lastIndexOf("?"));
}
/**
* 刪除本地臨時文件
*
* @param file
*/
public static void deleteTempFile(File file) {
if (file != null) {
File del = new File(file.toURI());
del.delete();
}
}
/**
* 通過文件名判斷並獲取OSS服務文件上傳時文件的contentType
*
* @param fileExtension 文件名擴展名
* @return 文件的contentType
*/
public static String getContentType(String fileExtension) {
// 文件的後綴名
if (".bmp".equalsIgnoreCase(fileExtension)) {
return "image/bmp";
}
if (".gif".equalsIgnoreCase(fileExtension)) {
return "image/gif";
}
if (".jpeg".equalsIgnoreCase(fileExtension) || ".jpg".equalsIgnoreCase(fileExtension)
|| ".png".equalsIgnoreCase(fileExtension)) {
return "image/jpeg";
}
if (".html".equalsIgnoreCase(fileExtension)) {
return "text/html";
}
if (".txt".equalsIgnoreCase(fileExtension)) {
return "text/plain";
}
if (".vsd".equalsIgnoreCase(fileExtension)) {
return "application/vnd.visio";
}
if (".ppt".equalsIgnoreCase(fileExtension) || "pptx".equalsIgnoreCase(fileExtension)) {
return "application/vnd.ms-powerpoint";
}
if (".doc".equalsIgnoreCase(fileExtension) || "docx".equalsIgnoreCase(fileExtension)) {
return "application/msword";
}
if (".xml".equalsIgnoreCase(fileExtension)) {
return "text/xml";
}
if (".mp4".equalsIgnoreCase(fileExtension)) {
return "video/mp4";
}
// android
if (".apk".equalsIgnoreCase(fileExtension)) {
return "application/vnd.android.package-archive";
}
// ios
if (".ipa".equals(fileExtension)) {
return "application/vnd.iphone";
}
// 默認返回類型
return "application/octet-stream";
}
}
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
3.controller編寫
/**
* 上傳文件
*
* @param file 文件
* @return
* @throws IOException
*/
@ResponseBody
@RequestMapping(value = "/urevf", method = RequestMethod.POST, proces = "application/json;charset=UTF-8")
public JSONObject uploadRealEstateVideoFiles(@RequestParam(value = "file") MultipartFile file) throws IOException {
//此處的video_file為阿里雲OSS上最外層文件夾,自己新建即可
return FilesUploadUtil.obtainTheFileUploadResult(file, "video_file");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
B. 如何把網站視頻同步到阿里雲
在阿里雲開通控制台,就可以在後台上傳了。
操作流程如下:1、登錄阿里雲,如果沒有賬戶需要先注冊一個賬號。
2、進去控制台,在產品與服務導航里點擊打開對象存儲OSS,沒有開通的話,開通一下。
3、開通以後,點擊左邊新建BUCKET,右邊的信息,補充填寫下。
4、點擊文件管理,上傳文件就可以了。
C. oss上傳視頻怎麼被壓縮
1、開通阿里雲的賬號,並登錄。
2、找到 OSS 並開通,如果提示需要實名認證就先實名認證,之後進入「管理控制台」。
3、在右邊的界面中,點擊創建 Bucket,這是類似存放文件的倉庫。
4、輸入 Bucket 名稱,選擇地域,其他的默認,壓縮就好了。
D. 小白使用阿里雲的oss實現文件雲存儲
項目需要上傳頭像,不想存在本地,之前用過阿里雲其他產品,這里就使用一下阿里雲的oss了,不得不說阿里雲的產品使用步驟真的很清晰.這里說一下我自己的使用步驟.
選擇對象存儲oss,進行開通
開通不要錢,有一定免費額度
許可權可以設置為公共讀
其實也就是兩步
1.引pom
2.復制黏貼大法
由於阿里雲一些密鑰配置和地域結點,bucket等是常量級的,所以我這里抽取出來放在了application.properties中, 方便管理 ,數據我手動加密了....大家換成自己的即可,
這些配置key=value key都是自己隨便寫的(也不是,起碼可以見名思意),只是為了我們配置的一個配置類可以利用spring的依賴注入填充value而已
說明:
說明:
我們阿里雲oss倉庫的url是一個咱們的倉庫+固定的地域結點值+咱們的文件名字,所以這里為了使上傳的文件名字不重復,使用了一個idworker,不知道的可以看一下 Twitter的 Snowflake(雪花演算法)
大家搭建完了可以用postman測試一下
ps:如果我們想方便管理或者後期擴展,我們這里也可以引入一個工具
我們可以用這個工具的一個方法String dirpath=new DateTime().tostring("yyyy/MM/dd");將當前的時間轉換為yyyy/MM/dd的格式,比如2020/02/03
這樣我們上傳的文件名字時候可以以這個dirpath作為我們的圖片所在的文件夾名稱,以分布式id生成器生成的id為名稱存儲.
下面看一下效果