java上传文件至阿里云oss工具类

第一步:引入oss maven坐标

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

第二步:上传工具类

package com.green.testlocalhost.service;

import com.aliyun.oss.ClientConfiguration;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.PutObjectResult;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;

/**
 * @author zdj
 * @Description: 阿里云 oss 上传工具类
 * @Date: 2019/5/10
 */
@Slf4j
@Data
@Component
public class OssUtil {
    
    
    private static String endPoint = "yourEndPoint";                          // oss域名
    private static String accessKeyId = "yourAccessKeyId";                    // accessKeyId
    private static String accessKeySecret = "yourAccessKeySecret";            // accessKeySecret
    private static String bucketName = "yourBucketName";                      // 桶名称
    private static String fileDir = "animal/";                                // 当前文件所属文件夹(就是你想给文件传到那个文件夹下面)

    /**
     * oss 工具客户端
     */
    private static OSSClient ossClient = null;

    /**
     * 上传文件至阿里云 OSS
     * @param file 待上传文件
     * 返回访问的全路径
     */
    public static String uploadFileToOss(MultipartFile file) {
    
    
        // 初始化oss
        initOSS(endPoint, accessKeyId, accessKeySecret);
        String visitUrl = null;
        try {
    
    
            // 获取文件名
            String orgName = file.getOriginalFilename();
            if (StringUtils.isEmpty(orgName)) {
    
    
                orgName = file.getName();
            }
            orgName = getFileName(orgName);
            String fileRelName = fileDir + orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.indexOf("."));
            // 上传至oss
            PutObjectResult result = ossClient.putObject(bucketName, fileRelName, file.getInputStream());
            if (result != null) {
    
    
                log.info("------OSS文件上传成功------");
            }
            // 拼接访问路径
            visitUrl = "https://" + bucketName + "." + endPoint + "/" + fileRelName;
        } catch (IOException e) {
    
    
            log.error(e.getMessage(), e);
            return null;
        }
        return visitUrl;
    }

    /**
     * 删除文件
     * @param fileName
     */
    public static void deleteFileToOss(String fileName) {
    
    
        ossClient.deleteObject(bucketName, fileName);
    }

    /**
     * 初始化 oss 客户端
     * @return
     */
    private static OSSClient initOSS(String endpoint, String accessKeyId, String accessKeySecret) {
    
    
        if (ossClient == null) {
    
    
            synchronized (OSSClient.class) {
    
    
                if (ossClient == null) {
    
    
                    ossClient = new OSSClient(endpoint, new DefaultCredentialProvider(accessKeyId, accessKeySecret), new ClientConfiguration());
                    // 设置权限(公开读)
                    ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
                }
            }
        }
        return ossClient;
    }

    /**
     * 判断文件名是否带盘符,重新处理
     * @param fileName
     * @return
     */
    public static String getFileName(String fileName){
    
    
        //判断是否带有盘符信息
        // Check for Unix-style path
        int unixSep = fileName.lastIndexOf('/');
        // Check for Windows-style path
        int winSep = fileName.lastIndexOf('\\');
        // Cut off at latest possible point
        int pos = (winSep > unixSep ? winSep : unixSep);
        if (pos != -1) {
    
    
            // Any sort of path separator found...
            fileName = fileName.substring(pos + 1);
        }
        //替换上传文件名字的特殊字符
        fileName = fileName.replace("=", "").replace(",", "").replace("&", "").replace("#", "");
        return fileName;
    }
}

第三步:实用controller

package com.green.testlocalhost.controller;

import com.green.testlocalhost.service.OssService;
import com.green.testlocalhost.vo.ResultData;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

/**
 * @Author zdj
 * @Date 2022/10/28 17:11
 * @Version 1.0
 */
@Api(tags = "文件管理")
@RestController
@RequestMapping("/file")
public class OssController {
    
    

    /**
     * oss服务类
     **/
    @Autowired
    private OssService ossService;

    /**
     * 图片上传,返回地址
     * @param file
     * @return
     */
    @RequestMapping(value = "/fileUpload", method = RequestMethod.POST)
    @ApiOperation(value = "图片上传接口(返回地址)", notes = "图片上传接口(返回地址)", httpMethod = "POST")
    public ResultData fileUpload(@RequestParam(value = "file", required = false) @RequestPart("file") MultipartFile file) throws IOException {
    
    
        if (file.getBytes() == null) {
    
    
           return ResultData.error("文件不能为空!");
        }
        return ossService.fileUpload(file);
    }
}

第四步: 实用service类

package com.green.testlocalhost.service;

import com.green.testlocalhost.vo.ResultData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

/**
 * @Author zdj
 * @Date 2022/10/28 17:22
 * @Version 1.0
 */
@Service
public class OssService {
    
    

    /**
     * oss服务类
     **/
    @Autowired
    private OssUtil ossBootUtil;

    /**
     * 图片上传,返回地址
     * @param file
     * @return
     */
    public ResultData fileUpload(MultipartFile file) {
    
    
        String upload = ossBootUtil.uploadFileToOss(file);
        return ResultData.ok("成功", upload);
    }
}

第五步:响应类ResultData

package com.green.testlocalhost.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * @Author zdj
 * @Date 2022/10/28 17:24
 * @Version 1.0
 */
@Data
public class ResultData<T> {
    
    
    public static final int CODE_SUCCESS = 200;//成功
    public static final int CODE_ERROR = 500;  //业务异常
    public static final int CODE_EXP = 900;    //服务器内部错误

    // 响应数据
    @ApiModelProperty(value = "响应数据", required = true)
    private T data;

    // 响应消息
    @ApiModelProperty(value = "响应消息", required = true)
    private String msg;

    // 状态
    @ApiModelProperty(value = "响应状态", required = true)
    private int code;

    public ResultData() {
    
    }
    public ResultData(int code, String msg, T data) {
    
    
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    /**
     *  用于写出去响应给浏览器的公告方法
     **/
    public static <T> ResultData<T> ok(Integer code, String msg, T data) {
    
    
        ResultData<T> responseData = new ResultData<T>();
        responseData.setCode(code);
        responseData.setMsg(msg);
        responseData.setData(data);
        return responseData;
    }

    /**
     *  响应成功
     **/
    public static <T> ResultData<T> ok(String msg, T data) {
    
    
        return ResultData.ok(ResultData.CODE_SUCCESS, msg, data);
    }

    /**
     *  响应失败
     **/
    public static <T> ResultData<T> error(String msg) {
    
    
        return ResultData.ok(ResultData.CODE_ERROR, msg, null);
    }

    /**
     *  服务器错误
     **/
    public static <T> ResultData<T> exp() {
    
    
        return ResultData.ok(ResultData.CODE_EXP, "服务器繁忙,请稍后再试", null);
    }
}

第六步:调用测试下
在这里插入图片描述
当前工具只是简单的文件上传,需要实现更多的功能,请自行扩展哦!

猜你喜欢

转载自blog.csdn.net/gelinwangzi_juge/article/details/127969308