利用阿里云做文件上传

相关架包

<dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.10.2</version>
        </dependency>

yaml配置文件

sky:
  alioss:
    endpoint: oss-cn-beijing.aliyuncs.com 申请的阿里云服务器地址,申请的是北京 
    accessKeyId: 阿里云为你设置的账号
    accessKeySecret: 阿里云为你设置的秘钥
    bucketName: 使用的桶名

在项目中创建一个工具类

具体使用,在controller实现用就行,

@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();
    }
}
接受yaml文件的Java类对象 其中的属性名要和yaml文件的配置名一一对应,否则用的时候会报

账号错误

@Component
@ConfigurationProperties(prefix = "sky.alioss")
@Data
public class AliOssProperties {

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;

}
创建bean对象,这步就很细,如果我们用之前的方法new对象和他其实大家感觉是不是一样的,其实对我们来说,可能是一样的,甚至如果只调用一次,我们在这里做这个配置类,还会费些心力,但是对于内存和程序运载的硬件来说,他会谢谢你(真心的),因为我们把它交给spring容器,它会给我们生成一个bean对象,每一次使用都会给我们一个bean。这里我还想扩展一下bean的生命周期,扩展知识放在最后,,,
@Configuration
public class OssConfiguration {

    @Autowired
    private AliOssProperties aliOssProperties;

    @Bean
    @ConditionalOnMissingBean
    public AliOssUtil aliOssUtil(){
        return new AliOssUtil(aliOssProperties.getEndpoint(),
                aliOssProperties.getAccessKeyId(),
                aliOssProperties.getAccessKeySecret(),
                aliOssProperties.getBucketName());
    }
}

controller(实现)层

@Slf4j
@RestController
@RequestMapping("/admin/common")
public class CommonUploadController {

    @Autowired
    private AliOssUtil aliOssUtil; 
    
@PostMapping("upload")
public Result<String> upload(@RequestParam("file")MultipartFile file) throws IOException {
        //打印日志
        log.warn("{}",file);
        //相关业务
        //得到文件名字
        String filename = file.getOriginalFilename();
        //名字组成部分
        //2.1后缀名
        String suffixname = filename.substring(filename.lastIndexOf("."));//jpg  png
        //2.2 生成文件名
        filename=UUID.randomUUID().toString().replace("-","")+suffixname;
        String url=aliOssUtil.upload(file.getBytes(),filename);
        return Result.success(url);
    }
}

下章补充bean的生命周期,我细总结一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值