OSS-browser下載下傳位址:https://github.com/aliyun/oss-browser/blob/master/all-releases.md
阿裡雲官方文檔 https://help.aliyun.com/document_detail/32008.html
原文連結:https://blog.csdn.net/u014079773/article/details/66968718?locationNum=9&fps=1#
因為所需是kotlin的,是以根據原文改寫了一個kotlin語言的 阿裡雲OSS對象存儲上傳圖檔
gradle配置
dependencies裡面增加
implementation 'com.aliyun.oss:aliyun-sdk-oss:2.5.0'
常量類
package com.beeb.web.module.aliyun
import com.aliyun.oss.OSSClient
import com.aliyun.oss.model.ObjectMetadata
import java.io.File
import java.io.FileInputStream
/**
* @class: AliyunOSSClientUtils
* @descript: java使用阿裡雲OSS存儲對象上傳
*/
object AliyunOSSClientUtils {
/** aliyun靜态配置 */
private var ENDPOINT = "XX" // 阿裡雲API的内或外網域名
private var ACCESS_KEY_ID = "XX" // 阿裡雲API的密鑰Access Key ID
private var ACCESS_KEY_SECRET = "XX" // 阿裡雲API的密鑰Access Key Secret
private var BACKET_NAME = "XX" // 阿裡雲API的bucket名稱
/**
* 擷取阿裡雲OSS用戶端對象
* @return ossClient
*/
val ossClient = OSSClient(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET)
/**
* 上傳圖檔至OSS
* @param ossClient oss連接配接
* @param file 上傳檔案(檔案全路徑)
* @param bucketName 存儲空間
* @param folder 模拟檔案夾名 如"dev_static/test/"
* @return String 傳回的唯一MD5數字簽名
*/
fun upload2OSS(file: File, folder: String): String {
var resultStr = ""
try {
// 以輸入流的形式上傳檔案
val `is` = FileInputStream(file)
// 檔案名
val fileName = file.name
// 檔案大小
val fileSize = file.length()
// 建立上傳Object的Metadata
val metadata = ObjectMetadata()
// 上傳的檔案的長度
metadata.contentLength = `is`.available().toLong()
// 指定該Object被下載下傳時的網頁的緩存行為
metadata.cacheControl = "no-cache"
// 指定該Object下設定Header
metadata.setHeader("Pragma", "no-cache")
// 指定該Object被下載下傳時的内容編碼格式
metadata.contentEncoding = "utf-8"
// 檔案的MIME,定義檔案的類型及網頁編碼,決定浏覽器将以什麼形式、什麼編碼讀取檔案。如果使用者沒有指定則根據Key或檔案名的擴充名生成,
// 如果沒有擴充名則填預設值application/octet-stream
metadata.contentType = getContentType(fileName)
// 指定該Object被下載下傳時的名稱(訓示MINME使用者代理如何顯示附加的檔案,打開或下載下傳,及檔案名稱)
metadata.contentDisposition = "filename/filesize=" + fileName + "/" + fileSize + "Byte."
// 上傳檔案 (上傳檔案流的形式)
val putResult = ossClient.putObject(BACKET_NAME, folder + fileName, `is`, metadata)
// 解析結果
resultStr = putResult.eTag
} catch (e: Exception) {
e.printStackTrace()
// logger.error("上傳阿裡雲OSS伺服器異常." + e.message, e)
}
return resultStr
}
/**
* 通過檔案名判斷并擷取OSS服務檔案上傳時檔案的contentType
* @param fileName 檔案名
* @return 檔案的contentType
*/
fun getContentType(fileName: String): String {
// 檔案的字尾名
val fileExtension = fileName.substring(fileName.lastIndexOf("."))
if (".bmp".equals(fileExtension, ignoreCase = true)) {
return "image/bmp"
}
if (".gif".equals(fileExtension, ignoreCase = true)) {
return "image/gif"
}
if (".jpeg".equals(fileExtension, ignoreCase = true) || ".jpg".equals(fileExtension, ignoreCase = true) || ".png".equals(fileExtension, ignoreCase = true)) {
return "image/jpeg"
}
if (".html".equals(fileExtension, ignoreCase = true)) {
return "text/html"
}
if (".txt".equals(fileExtension, ignoreCase = true)) {
return "text/plain"
}
if (".vsd".equals(fileExtension, ignoreCase = true)) {
return "application/vnd.visio"
}
if (".ppt".equals(fileExtension, ignoreCase = true) || "pptx".equals(fileExtension, ignoreCase = true)) {
return "application/vnd.ms-powerpoint"
}
if (".doc".equals(fileExtension, ignoreCase = true) || "docx".equals(fileExtension, ignoreCase = true)) {
return "application/msword"
}
return if (".xml".equals(fileExtension, ignoreCase = true)) {
"text/xml"
} else "image/jpeg"
// 預設傳回類型
}
}
檔案上傳接口
/**
* 檔案上傳到OSS
*/
@PostMapping(value = ["/upload"], consumes = [MediaType.MULTIPART_FORM_DATA_VALUE])
fun handleFileUpload(@RequestPart("file") filePart: FilePart): Mono<Status> {
val tempFile = Files.createTempFile("test", filePart.filename())
val channel = AsynchronousFileChannel.open(tempFile, StandardOpenOption.WRITE)
DataBufferUtils.write(filePart.content(), channel, 0).subscribe()
// 上傳 Oss
val md5key = AliyunOSSClientUtils.upload2OSS(tempFile.toFile(), osspath)
return Mono.just(Status.Ok("${md5key}: " + tempFile.toString()))
}
運作結果可以登入OSS控制台檢視