天天看點

上傳圖檔到OSS-browser

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控制台檢視