← 返回文章列表

阿里云 OSS 文件上传

javaoss

基于阿里云 OSS Java SDK 封装工具类,实现文件上传与访问。

package com.sky.utils;  
  
import com.aliyun.oss.ClientException;  
import com.aliyun.oss.OSS;  
import com.aliyun.oss.OSSClientBuilder;  
import com.aliyun.oss.OSSException;  
import lombok.AllArgsConstructor;  
import lombok.Data;  
import lombok.extern.slf4j.Slf4j;  
import java.io.ByteArrayInputStream;  
  
@Data  
@AllArgsConstructor  
@Slf4j  
public class AliOssUtil {  
  
    private String endpoint;  
    private String accessKeyId;  
    private String accessKeySecret;  
    private String bucketName;  
  
    /**  
     * 文件上传  
     *  
     * @param bytes  
     * @param objectName  
     * @return  
     */  
    public String upload(byte[] bytes, String objectName) {  
  
        // 创建OSSClient实例。  
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);  
  
        try {  
            // 创建PutObject请求。  
            ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));  
        } catch (OSSException oe) {  
            System.out.println("Caught an OSSException, which means your request made it to OSS, "  
                    + "but was rejected with an error response for some reason.");  
            System.out.println("Error Message:" + oe.getErrorMessage());  
            System.out.println("Error Code:" + oe.getErrorCode());  
            System.out.println("Request ID:" + oe.getRequestId());  
            System.out.println("Host ID:" + oe.getHostId());  
        } catch (ClientException ce) {  
            System.out.println("Caught an ClientException, which means the client encountered "  
                    + "a serious internal problem while trying to communicate with OSS, "  
                    + "such as not being able to access the network.");  
            System.out.println("Error Message:" + ce.getMessage());  
        } finally {  
            if (ossClient != null) {  
                ossClient.shutdown();  
            }  
        }  
  
        //文件访问路径规则 https://BucketName.Endpoint/ObjectName        StringBuilder stringBuilder = new StringBuilder("https://");  
        stringBuilder  
                .append(bucketName)  
                .append(".")  
                .append(endpoint)  
                .append("/")  
                .append(objectName);  
  
        log.info("文件上传到:{}", stringBuilder.toString());  
  
        return stringBuilder.toString();  
    }  
}

package com.sky.controller.admin;  
  
import com.sky.result.Result;  
import com.sky.utils.AliOssUtil;  
import io.swagger.annotations.Api;  
import io.swagger.annotations.ApiOperation;  
import lombok.extern.slf4j.Slf4j;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.web.bind.annotation.PostMapping;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RestController;  
import org.springframework.web.multipart.MultipartFile;  
  
import java.io.IOException;  
import java.util.UUID;  
  
/**  
 * 通用上传接口  
 */  
  
@RestController  
@RequestMapping("/admin/common")  
@Api(tags = "通用接口")  
@Slf4j  
public class CommonController {  
  
    @Autowired  
    private AliOssUtil aliOssUtil;  
  
    @ApiOperation("文件上传")  
    @PostMapping("/upload")  
    public Result<String> upload(MultipartFile file) {  
        log.info("文件上传:{}", file);  
  
        try {  
            //原始文件名  
            String originalFilename = file.getOriginalFilename();  
            //截取原始文件名后缀  
            String extension = originalFilename.substring(originalFilename.lastIndexOf("."));  
            //生成上传文件名  
            String objectName=UUID.randomUUID().toString()+extension;  
            //创建上传文件名  
            String filePath=aliOssUtil.upload(file.getBytes(), objectName);  
  
            return Result.success(filePath);  
  
        } catch (IOException e) {  
            log.error("文件上传失败:{}", e);  
        }  
  
        return null;  
    }  
  
  
}