Springboot+mybatis集成上传文件至阿里云OSS中,(不经过服务器,直接上传到OSS)

1.先在maven中添加依赖

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

2.在yml.xml文件中添加配置

aliyun:
    access-id:   你的id
    access-key:  你的key
    bucket:      你的buket
    endpoint:    你的endpoint
    dir:         设置文件存放文件夹 随便写  上传自动生成

3.写完配置需要一个实体类接受(我是使用的idea中安装的lombok的插件@Data注入,当然可以写get,set方法。)

import jdk.nashorn.internal.objects.annotations.Setter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;
import com.xg.utils.oss.AliyunOssUtils;
import lombok.data;

@Configuration
@Data
public class AliyunOssProperties {
    @Value("${aliyun.access-id}")
    private String accessId;
    @Value("${aliyun.access-key}")
    private String accessKey;
    @Value("${aliyun.bucket}")
    private String bucket;
    @Value("${aliyun.endpoint}")
    private String endpoint;
    @Value("${aliyun.dir}")
    private String dir;
}

3.上传工具类接口

import java.io.File;
import org.springframework.web.multipart.MultipartFile;
public interface AliyunOssService {
    /** 上传文件*/
    public  String  upLoad(File file,Long uid);

    public  File  upLoadFile(MultipartFile  multipartFile);

    public void deleteFile(String filePath);

4.上传工具类实现类

package com.xg.api.service.impl;

import com.xg.api.service.AliyunOssService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import  com.xg.api.config.AliyunOssProperties;
import java.io.File;
import java.text.SimpleDateFormat;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.CreateBucketRequest;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import org.springframework.web.multipart.MultipartFile;
import java.io.FileOutputStream;

@Service
public class AliyunOssServiceImpl implements AliyunOssService {
    @Autowired
     private  AliyunOssProperties  aliyunOssProperties;
    @Override
    public  String upLoad(File file,Long uid){

        SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");

        // 判断文件
        if(file==null){
            return null;
        }
        String fileUrl = "";
        OSSClient client=new OSSClient(aliyunOssProperties.getEndpoint(), aliyunOssProperties.getAccessId(), aliyunOssProperties.getAccessKey());
        try {
            // 判断容器是否存在,不存在就创建
            if (!client.doesBucketExist(aliyunOssProperties.getBucket())) {
                client.createBucket(aliyunOssProperties.getBucket());
                CreateBucketRequest createBucketRequest = new CreateBucketRequest(aliyunOssProperties.getBucket());
                createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
                client.createBucket(createBucketRequest);
            }
            // 设置文件路径和名称
            fileUrl = (uid + file.getName().substring(file.getName().lastIndexOf("."),file.getName().length()));
            //为了删除原来的文件
            deleteFile(fileUrl);        

            // 上传文件
            PutObjectResult result = client.putObject(new PutObjectRequest(aliyunOssProperties.getBucket(), fileUrl, file));
            System.out.println("文件地址:"+fileUrl);
            // 设置权限(公开读)
            client.setBucketAcl(aliyunOssProperties.getBucket(), CannedAccessControlList.PublicRead);          
        }catch (OSSException oe){

            oe.getMessage();
        }catch (ClientException ce){
            ce.getErrorMessage();
        }finally{
            if(client!=null){
                client.shutdown();
            }
        }
        return fileUrl;
    }

    @Override
    public  File  upLoadFile(MultipartFile multipartFile){
        File newFile =null;
        try {
            String filename = multipartFile.getOriginalFilename();
            if (multipartFile!=null) {
                if (!"".equals(filename.trim())) {
                    newFile   = new File(filename);
                    FileOutputStream os   = new FileOutputStream(newFile);
                    os.write(multipartFile.getBytes());
                    os.close();
                    multipartFile.transferTo(newFile);
                }
            }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            return  newFile;
        }

    public void deleteFile(String filePath) {
        OSSClient ossClient=new OSSClient(aliyunOssProperties.getEndpoint(), aliyunOssProperties.getAccessId(), aliyunOssProperties.getAccessKey());
        boolean exist = ossClient.doesObjectExist(aliyunOssProperties.getBucket(), filePath);
        ossClient.deleteObject(aliyunOssProperties.getBucket(), filePath);
        ossClient.shutdown();
    }
    }

3.Controller中的调用。StringUtilUrl.getURL()是指上传的固定的路径

@RequestMapping(value = "/new_icon", method = RequestMethod.POST)
public XgResp new_icon(@RequestAttribute("uid")Long uid, @RequestParam("icon") MultipartFile icon) {
   if (icon.isEmpty()) {
      return XgResp.fail().msg("上传头像数据为空");
   }
   File savedName  = aliyunOssService.upLoadFile(icon);
   String uploadUrl = aliyunOssService.upLoad(savedName,uid);
   if (uploadUrl!=null) {
      String  uploadUrlIoc = StringUtilUrl.getURL()+uploadUrl;
      UserInfo userInfo = userService.findByUid(uid);
      if (userInfo != null) {
         userInfo.setIcon(uploadUrlIoc);
         userService.save(userInfo);
      }
      XgRespData respData = new XgRespData();
      respData.put("icon", uploadUrl);
      return XgResp.success().with(respData.data());
   }else {
      return XgResp.fail().msg("存储头像数据出错");
   }

}

按照以上代码整合自己需求功能,整个文件上传到阿里云的OSS基本上就完成了,不过该文件是先上传服务器,然后再上传OSS对象,所以不般不要采用该方式上传,根据OSS官方的API可以通过流式上传直接使用MultiparFile格式上传,该代码的实现方式如下:。

public  String uploadOSSFree(MultipartFile uploadFile, String picturePath) {
    // 创建OSSClient实例
    OSSClient ossClient = new OSSClient(aliyunOssProperties.getEndpoint(), aliyunOssProperties.getAccessId(), aliyunOssProperties.getAccessKey());
    String url=null;
  
    try {
        // 上传:picturePath + uploadFile.getOriginalFilename() --> key
        ossClient.putObject(aliyunOssProperties.getBucket(), fileUrl, new ByteArrayInputStream(uploadFile.getBytes()));
        // 关闭client
        ossClient.shutdown();
        //设置过期时间 -- 十年
        Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 10);
        //取出文件上传路径
         url = ossClient.generatePresignedUrl(aliyunOssProperties.getBucket(), picturePath, expiration).toString();

    } catch (OSSException oe) {
        oe.getMessage();
    }catch(Exception e ){
        e.printStackTrace();
    }
    return  url;
}

 

将上面最上面的Service中的方法改成uploadOSSFree,Controller直接调用uploadOSSFree方法即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值