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