上传图片到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控制台查看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值