自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

文件上傳把服務(wù)器搞崩了?

開發(fā) 項目管理
一般要么自己搭建文件服務(wù)器,要么使用付費的文件服務(wù)。比如七牛云、阿里云、騰訊云等。今天我們就一起來聊聊如何使用阿里云OSS文件上傳。

記得以前剛開始學(xué)習(xí)web項目的時候,經(jīng)常涉及到需要上傳圖片啥的,那時候都是把圖片上傳到當(dāng)前項目文件夾下面,每次項目一重啟圖片就丟了。雖然可以通過修改/tomcat/conf/server.xml配置文件,配置一個上傳圖片的本地文件夾,即配置一個工程配置虛擬路徑,這樣可以避免項目重啟圖片丟失。

自從參加工作以來基本就沒有遇到使用這種方式來存儲圖片了。一般要么自己搭建文件服務(wù)器,要么使用付費的文件服務(wù)。比如七牛云、阿里云、騰訊云等。今天我們就一起來聊聊如何使用阿里云OSS文件上傳。

oss 文件上傳

使用OSS文件上傳,阿里云提供了如下幾種方式,大家可以選擇適合自己的方式。

Web端上傳

Web端常見的上傳方法是用戶在瀏覽器或App端上傳文件到應(yīng)用服務(wù)器,應(yīng)用服務(wù)器再把文件上傳到OSS。具體流程如下圖所示:

這種方式肯定不可取它有如下缺點:

  • 上傳慢:用戶數(shù)據(jù)需先上傳到應(yīng)用服務(wù)器,之后再上傳到OSS,網(wǎng)絡(luò)傳輸時間比直傳到OSS多一倍。如果用戶數(shù)據(jù)不通過應(yīng)用服務(wù)器中轉(zhuǎn),而是直傳到OSS,速度將大大提升。而且OSS采用BGP帶寬,能保證各地各運營商之間的傳輸速度。
  • 擴展性差:如果后續(xù)用戶數(shù)量逐漸增加,則應(yīng)用服務(wù)器會成為瓶頸。本來就已經(jīng)采用了OSS上傳了,然后還要在占用自己服務(wù)器。
  • 費用高:需要準(zhǔn)備多臺應(yīng)用服務(wù)器。由于OSS上行流量是免費的,如果數(shù)據(jù)直傳到OSS,將節(jié)省多臺應(yīng)用服務(wù)器的費用。

JavaScript客戶端簽名直傳

這種方式采用純前端直接上傳,不經(jīng)過應(yīng)用服務(wù)器,不過這種方式阿里云給到的一些關(guān)于OSS上傳的一些核心參數(shù)(AccesssKey ID和AccessKey Secret相當(dāng)于我們在阿里云那邊申請的賬號和密碼)也需要寫在前端代碼里面,這樣就容易導(dǎo)致我們核心參數(shù)被泄漏。存在安全隱患。這種方式也不推薦。

服務(wù)端簽名后直傳

前面直接在前端簽名上傳會有安全隱患,存在參數(shù)泄漏。我們可以把參數(shù)放在服務(wù)端,然服務(wù)端和阿里云去交互,這樣就不存在核心參數(shù)的泄漏。

如何接入

引入依賴

  • 因為本人是從事java開發(fā)的,所以直接引入官方提供最新的maven依賴。
<!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.14.0</version>
</dependency>

為什么要引入最新的依賴。因為如果遇到什么問題需要找阿里云的人幫忙解決的時候,別人大多數(shù)都會問你什么版本的sdk,然后如果遇到那種一時半會比較難解決的問題,人家會推薦你升級最新版本試試。因為可能在最新版本修復(fù)了你所遇到的bug。有人可能會說,引入最新版本不就是幫別人踩坑嗎?萬一解決一個bug又引入兩個bug列?這種情況也不是沒有可能的。

服務(wù)端構(gòu)建簽名

上圖是官網(wǎng)提供的入門例子,代碼是一大坨,我們可以看看稍微優(yōu)化后的代碼:創(chuàng)建一個單例的ossClient,可以復(fù)用線程,不需要每次都去new ossClient().

String host = String.format("https://%s.%s", ossPropertoooies.getBucketName(), ossPropertoooies.getEndpoint());
long expiredTime = System.currentTimeMillis() + fileOssProperties.getUploadSignatureTtl();
Date expiration = new Date(expiredTime);

// 根據(jù)文件名和文件類型設(shè)置存儲路徑,可以按照文件類型+日期格式+UUID文件名 進行分割
String filepath = getFilePath(request.getCategory(), request.getFilename());

PolicyConditions policyConditions = new PolicyConditions();
policyConditions.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, fileOssProperties.getUploadSizeLimit());
policyConditions.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, filepath);

String postPolicy = ossClient.generatePostPolicy(expiration, policyConditions);
byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8);
String encodedPolicy = BinaryUtil.toBase64String(binaryData);
String postSignature = ossClient.calculatePostSignature(postPolicy);

SignatureDTO signature = new SignatureDTO();
signature.setAccessId(ossPropertoooies.getAccessKeyId());
signature.setPolicy(encodedPolicy);
signature.setSignature(postSignature);
signature.setFilepath(filepath);
signature.setHost(host);
signature.setExpire(fileOssProperties.getUploadSignatureTtl() / 1000);
signature.setReqFilename(request.getFilename());

接入起來還是非常簡單的,一個后端簽名,前端上傳前后分離的文件上傳就已經(jīng)完成了。這里我們使用postman模擬下前端上傳,當(dāng)然這里可以改為前端使用ajax,或者其他方式都可以。上傳的url是由我們自己申請的bucketname和endpoint組成的。

但是其實這里面也是有許多坑的我們還是需要稍微注意下。

帶寬限制

上傳和下載都會有帶寬的限制,如果我們是采用外網(wǎng)直傳到阿里云oss的話,需要注意下我們的外網(wǎng)帶寬是否夠用,以及應(yīng)對大文件的上傳是不是會把帶寬打滿。如果帶寬被打滿我們上傳就gg了。同樣的下載也有帶寬限制的,需要避免大文件的下載,如果遇到這種大文件下載我們可以采用其他的方式,比如使用oss的客戶端。所以我們需要合理的考慮我們服務(wù)器的帶寬。如果我們的應(yīng)用直接是部署在阿里云上面的話,我們可以采用內(nèi)網(wǎng)的上傳和下載。這樣的話就不會有帶寬的限制。

API使用需要注意點

當(dāng)我們使用OSSclient提供的一些api使用的時候需要仔細去看看里面是怎么實現(xiàn)的,或者看看它的文檔有沒有特殊交代的。比如使用OSSclient提供的processObject方法我們最后需要關(guān)閉輸入流,如果流不關(guān)閉,鏈接不被釋放。應(yīng)用鏈接馬上就會被占滿,然后服務(wù)就會成為一個假死的狀態(tài),這個問題我們在生產(chǎn)環(huán)境就遇到一次。如下圖所示線程一直沒有被釋放。

像這種為什么需要我們手動去關(guān)閉流,為什么不直接api幫我們關(guān)閉,阿里云的回復(fù)是因為這里返回的流可能業(yè)務(wù)方自己需要復(fù)制、或者讀什么的。所以需要調(diào)用方主動關(guān)閉下,在這個很隱秘的文檔中我們也有找到這個答案。

責(zé)任編輯:武曉燕 來源: java金融
相關(guān)推薦

2019-07-03 14:26:10

Linux服務(wù)器方法

2010-07-15 13:54:25

最“搞”服務(wù)器

2016-03-21 09:05:06

2023-10-30 08:10:26

Map存儲信息

2024-11-21 09:55:25

2022-10-25 17:53:09

Java線程池

2015-10-08 09:38:24

HTTP網(wǎng)絡(luò)協(xié)議文件傳輸

2015-09-29 09:25:20

HTTP網(wǎng)絡(luò)協(xié)議

2015-10-09 09:41:24

HTTP網(wǎng)絡(luò)協(xié)議文件傳輸

2015-10-10 16:46:14

HTTP網(wǎng)絡(luò)協(xié)議文件傳輸

2015-09-28 13:39:13

Http網(wǎng)絡(luò)協(xié)議HTTP

2011-08-18 16:03:34

iPhone上傳圖片

2017-03-02 11:58:31

NodeJS服務(wù)器

2024-03-14 10:51:13

服務(wù)器技術(shù).NET Core

2023-03-06 08:59:18

AMD顯卡驅(qū)動

2021-07-15 09:50:31

服務(wù)器實踐 架構(gòu)

2022-11-10 15:17:43

Windows文件Linux

2021-09-10 10:07:17

Nginx虛擬主機服務(wù)器

2021-03-01 08:05:09

慢查詢SQL

2020-12-02 11:48:05

TFTP
點贊
收藏

51CTO技術(shù)棧公眾號