什麼是OSS對象存儲??
OSS對象存儲主要使用於什麼場景??
圖片和音視頻等應用的海量存儲
OSS可用於圖片、音視頻、日誌等海量文件的存儲。各種終端設備、Web網站程序、移動應用可以直接向OSS寫入或讀取數據。OSS支持流式寫入和文件寫入兩種方式。
網頁或者移動應用的靜態和動態資源分離
利用BGP帶寬,OSS可以實現超低延時的數據直接下載。OSS也可以配合阿里雲CDN加速服務,爲圖片、音視頻、移動應用的更新分發提供最佳體驗。
雲端數據處理
上傳文件到OSS後,可以配合媒體處理服務和圖片處理服務進行雲端的數據處理。
主要使用步驟(以Springboot熱部署爲例):
- 在pom.xml文件添加依賴
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.8.3</version>
</dependency>
- 編寫配置文件(以阿里雲服務器的OSS對象存儲爲例),主要思想分兩步走
第一步:先創建客戶端,配置endpoint,accessKeyId,accessKeySecret,bucketName,host,imgdir,filedir等詳細信息
@Component
public class OSSClientUtil {
protected static final Logger log = LoggerFactory.getLogger(OSSClientUtil.class);
private String endpoint = "自己的endpoint";
private String accessKeyId = "自己的accessKeyId";
private String accessKeySecret = "自己的accessKeySecret";
private String bucketName = "自己的bucketName";
private String host = "自己的項目主機";
//圖片存儲目錄
private String imgdir = "寫啥隨意/";
//文件存儲目錄
private String filedir = "寫啥隨意/";
public void changeFiledir(String filedir) {
}
/**
* 上傳圖片
* @param file
* @return
* @throws Exception
*/
public String uploadImg2Oss(MultipartFile file) throws Exception {
if (file.getSize() > 10 * 1024 * 1024) {
throw new Exception("上傳圖片大小不能超過10M");
}
String originalFilename = file.getOriginalFilename();
String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
Random random = new Random();
String name = random.nextInt(10000) + System.currentTimeMillis() + substring;
try {
// TODO: 2020/6/2 update
InputStream inputStream = file.getInputStream();
this.uploadImg2Oss(inputStream, name);
return name;
} catch (Exception e) {
log.info("文件目錄爲:"+ getUrl(bucketName));
throw new Exception("上傳失敗...");
}
}
/**
* 上傳圖片獲取fileurl
* @param inputStream 輸入流
* @param fileurl 文件路徑
* @return 上傳成功
*/
private String uploadImg2Oss(InputStream inputStream, String fileurl) {
String ret = "";
try {
//創建上傳Object的Metadata
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(inputStream.available());
objectMetadata.setCacheControl("no-cache");
objectMetadata.setHeader("Pragma","no-cache");
objectMetadata.setContentType(getcontentType(fileurl.substring(fileurl.lastIndexOf("."))));
objectMetadata.setContentDisposition("inline;filename=" + fileurl);
//上傳文件
OSSClient ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
PutObjectResult putObjectResult = ossClient.putObject(bucketName,imgdir + fileurl,inputStream,objectMetadata);
ret = putObjectResult.getETag();
}catch (Exception e){
log.error(e.getMessage(),e);
}finally {
try {
if(inputStream != null){
inputStream.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
return ret;
}
/**
* 獲取文件路徑
* @param fileUrl 文件路徑
* @return
*/
public String getImgUrl(String fileUrl) {
if(StringUtils.isNotEmpty(fileUrl)){
String[] split = fileUrl.split("/");
// String url = this.getImgUrl(this.imgdir + split[split.length - 1]);
String url = this.imgdir + split[split.length - 1];
//log.info("該圖片的路徑爲",url);
return url;
}
return null;
}
/**
* 刪除文件
* @param filename 文件名稱
*/
public void deleteFile(GenericRequest filename) {
OSSClient ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
String fileName = getFileName(filename);
ossClient.deleteObject(bucketName,imgdir+fileName);
ossClient.shutdown();
}
public static String getFileName(GenericRequest path){
String fileName = new File(String.valueOf(path)).getName();
//return fileName.substring(0, fileName.indexOf("?"));
return fileName;
}
/**
*生成url連接
* @param key
* @return
*/
public String getUrl(String key){
//設置URL過期間爲10年
Date expiration = new Date(System.currentTimeMillis() + 3600*1000*24*365*10);
//生成URL
OSSClient ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
URL url = ossClient.generatePresignedUrl(bucketName,key,expiration);
if(url != null){
return url.toString();
}
return null;
}
/**
*
* @param FilenameExtension 文件後綴格式
* @return
*/
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";
}
}
第二步:創建文件上傳工具類
public class OssuploadUtil {
public String updateHead(MultipartFile file) throws Exception {
if (file == null || file.getSize() <= 0) {
throw new Exception("file不能爲空");
}
OSSClientUtil ossClient = new OSSClientUtil();
String fileUrl = ossClient.uploadImg2Oss(file);
String imgUrl = ossClient.getImgUrl(fileUrl);
String[] split = imgUrl.split("\\?");
return split[0];
}
/**
* 上傳圖片到指定的文件夾
* @param file
* @param filedir
* @return
* @throws Exception
*/
public String updateHead(MultipartFile file, String filedir) throws Exception {
if (file == null || file.getSize() <= 0) {
throw new Exception("file不能爲空");
}
OSSClientUtil ossClient = new OSSClientUtil();
ossClient.changeFiledir(filedir);
String name = ossClient.uploadImg2Oss(file);
String imgUrl = ossClient.getImgUrl(name);
String[] split = imgUrl.split("\\?");
return split[0];
}
/**
* 上傳多張圖片,然後拼接所有的url
*
* @param image
* @return
*/
public Result uploadReturnUrl(List<String> image) {
StringBuilder imageStr = new StringBuilder();
for (int i = 0; i < image.size(); i++) {
MultipartFile file = Base64tTransformUtil.base64ToMultipart(image.get(i));
try {
String url = this.updateHead(file);
System.out.println("第" + (i + 1) + "張圖片路徑: " + url);
if (i + 1 == image.size()) {
imageStr.append(url);
} else {
imageStr.append(url + ",");
}
} catch (Exception e) {
e.printStackTrace();
return new Result().fail("圖片上傳失敗!!!");
}
}
return new Result().success(imageStr.toString(), "圖片上傳成功");
}
/**
* 上傳一張圖片
*
* @param image
* @return
*/
public Result oneuploadReturnUrl(String image) {
String url;
MultipartFile file = Base64tTransformUtil.base64ToMultipart(image);
try {
url = this.updateHead(file);
System.out.println("圖片路徑: " + url);
} catch (Exception e) {
e.printStackTrace();
return new Result().fail("圖片上傳失敗!!!");
}
return new Result().success(url, "圖片上傳成功");
}
/**
* 上傳一張圖片到是定文件將夾
*
* @param image
* @return
*/
public Result oneuploadReturnUrlToPoint(String image, String filedir) {
String url;
MultipartFile file = Base64tTransformUtil.base64ToMultipart(image);
try {
url = this.updateHead(file, filedir);
System.out.println("圖片路徑: " + url);
} catch (Exception e) {
e.printStackTrace();
return new Result().fail("圖片上傳失敗!!!");
}
return new Result().success(url, "圖片上傳成功");
}
/**
*
* @MethodName: deleteFile
* @Description: 單文件刪除
* @param fileUrl 需要刪除的文件url
* @return boolean 是否刪除成功
*/
public boolean deleteFile(String fileUrl){
OSSClientUtil ossClient = new OSSClientUtil();
/**
* 根據url獲取bucketName
*/
String bucketName = OssuploadUtil.getBucketName(fileUrl);
/**
* 根據url獲取fileName
*/
String fileName = OssuploadUtil.getFileName(fileUrl);
if(bucketName==null||fileName==null) {
return false;
}
try {
GenericRequest request = new DeleteObjectsRequest(bucketName).withKey(fileName);
ossClient.deleteFile(request);
} catch (Exception oe) {
oe.printStackTrace();
return false;
}
return true;
}
/**
*
* @MethodName: getBucketName
* @Description: 根據url獲取bucketName
* @param fileUrl 文件url
* @return String bucketName
*/
public static String getBucketName(String fileUrl){
String http = "http://";
String https = "https://";
int httpIndex = fileUrl.indexOf(http);
int httpsIndex = fileUrl.indexOf(https);
int startIndex = 0;
if(httpIndex==-1){
if(httpsIndex==-1){
return null;
}else{
startIndex = httpsIndex+https.length();
}
}else{
startIndex = httpIndex+http.length();
}
int endIndex = fileUrl.indexOf(".oss-");
return fileUrl.substring(startIndex, endIndex);
}
/**
*
* @MethodName: getFileName
* @Description: 根據url獲取fileName
* @param fileUrl 文件url
* @return String fileName
*/
public static String getFileName(String fileUrl){
String str = "aliyuncs.com/";
int beginIndex = fileUrl.indexOf(str);
if(beginIndex==-1) {
return null;
}
return fileUrl.substring(beginIndex+str.length());
}
}