阿里云OSS-文件上传(共有、私有)

package com.fcb.car.omssvc.api.controller.v1;

import com.evergrande.cloud.web.dto.ResponseDto;
import com.evergrande.cloud.web.dto.Results;
import com.evergrande.cloud.web.web.BaseWebController;
import com.fcb.car.omssvc.service.UploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.codec.multipart.FilePart;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;


/**
 * @author radish.zhou
 * @version 1.0
 */
@RestController
@RequestMapping("/oms/v1/upload")
public class UploadController extends BaseWebController {

    @Autowired
    private UploadService uploadervice;

    /**
     * 文件上传 /type 0公有  1 私有
     * @param uploadFile
     * @return
     */
    @PostMapping("/uploadFile")
    public Mono<ResponseDto<Object>> upload(@RequestPart("file") FilePart uploadFile,@RequestParam("type") int type) {
        return Results.successObj(uploadervice.upload(uploadFile, type));

    }


    /**
     * 获取文件下载url前缀
     * @param
     * @return
     */
    @GetMapping(path = {"/getPrefix"})
    public Mono<ResponseDto<Object>>  getPrefix() {
        return Results.successObj(uploadervice.getPrefix());
    }

@GetMapping("/getOssUrl")
    public Mono<ResponseDto<Object>> getOssUrl(@RequestParam("fileKeys") String fileKeys, @RequestParam(name = "expiration", defaultValue = "1000", required = false) int expiration) {
        logger.info("进入 获取oss url方法, fileKeys:{}, expiration:{}", fileKeys, expiration);
        return Results.successObj(uploadService.getOssUrl(fileKeys, expiration));
    }

}
package com.fcb.car.omssvc.service;


import com.fcb.car.omssvc.api.dto.OssInfoDto;
import org.springframework.http.codec.multipart.FilePart;


/**
 * <p>
 * 服务类
 * </p>
 *
 * @author xangqun
 * @since 2020-03-25
 */
public interface UploadService {

    String upload(FilePart uploadFile,int type);

    OssInfoDto getPrefix();

 /**
     * 获取oss url
     *
     * @param keys
     * @param expiration
     * @return
     */
    String getOssUrl(String keys,int expiration);
}
package com.fcb.car.omssvc.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.model.ObjectMetadata;
import com.evergrande.cloud.base.id.IdGen;
import com.fcb.car.omssvc.api.dto.OssInfoDto;
import com.fcb.car.omssvc.service.UploadService;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.http.codec.multipart.FilePart;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.nio.file.Files;
import java.nio.file.Path;

/**
 * <p>
 * 服务实现类
 *
 * </p>
 *
 * @author xangqun
 * @since 2020-03-25
 */
@Slf4j
@Service
@RefreshScope
public class UploadServiceImpl implements UploadService {


    @Value("${aliyun.oss.pub.endpoint}")
    private String endpoint;

    @Resource(name = "pubOssBucketName")
    private String pubOssBucketName;

    @Resource(name = "priOssBucketName")
    private String priOssBucketName;


    @Resource(name = "pubOssClient")
    private OSS pubOssClient;

    @Resource(name = "priOssClient")
    private OSS priOssClient;

    @Value("${aliyun.oss.pri.bucketName}")
    private String priBucketName;


    @Override
    @Transactional(rollbackFor = Exception.class)
    public String upload(FilePart filePart, int type) {
        String filePath = "";
        try {
            Path path = Files.createTempFile("test", filePart.filename());
            String fileType = Files.probeContentType(path);
            filePart.transferTo(path);
            //获得file对象
            File file = new File(path.toString());
            String fileName = file.getName();
            ByteArrayOutputStream bos;
            try (FileInputStream fis = new FileInputStream(file)) {
                bos = new ByteArrayOutputStream();
                byte[] b = new byte[1024];
                int len = -1;
                while ((len = fis.read(b)) != -1) {
                    bos.write(b, 0, len);
                }
            }
            byte[] array = bos.toByteArray();
            // MultipartFile uploadFile = new MockMultipartFile("file", fileName, "jpg", array);
            MultipartFile uploadFile = new MockMultipartFile("file", fileName, fileType, array);

            String filename = uploadFile.getOriginalFilename();
            filePath = getFilePath(filename);

            // 创建Metadata
            ObjectMetadata metadata = new ObjectMetadata();
            String md5 = BinaryUtil.toBase64String(BinaryUtil.calculateMd5(uploadFile.getBytes()));
            metadata.setContentMD5(md5);
            metadata.setContentType("text/plain");
            metadata.setContentDisposition("attachment;filename=\"" + filename + "\"");
            if (type == 0) {//上传公有
                pubOssClient.putObject(pubOssBucketName, filePath, new ByteArrayInputStream(uploadFile.getBytes()), metadata);
            } else {//上传私有
                priOssClient.putObject(priOssBucketName, filePath, new ByteArrayInputStream(uploadFile.getBytes()), metadata);
            }

        } catch (Exception e) {
            log.error("upload error:", e);
            return null;
        }
        return filePath;
    }


    @Override
    public OssInfoDto getPrefix() {
        OssInfoDto ossInfoDto = new OssInfoDto();
        ossInfoDto.setEndpoint(endpoint);
        ossInfoDto.setBucketName(priBucketName);
        return ossInfoDto;
    }

    private String getFilePath(String filename) {

        DateTime dateTime = new DateTime();
        return "car/" + dateTime.toString("yyyy")
                + "/" + dateTime.toString("MM") + "/"
                + dateTime.toString("dd") + "/" + IdGen.uuid();
    }


    private String getExcelPath(String filename) {

        DateTime dateTime = new DateTime();
        return "hdb/upload/" + dateTime.toString("yyyyMMddHHmmssSS") + filename;
    }


@Override
    public String getOssUrl(String keys, int expiration) {
        Date expirations = new Date(System.currentTimeMillis() + 3600L * expiration);
        DefaultCredentials defaultCredentials = new DefaultCredentials(accessKeyId, accessKeySecret);
        CredentialsProvider provider = new DefaultCredentialProvider(defaultCredentials);
        OSSClient ossClient = new OSSClient(ossConfig.getEndpoint(), provider, null);
        URL url = ossClient.generatePresignedUrl(bucketName, keys, expirations);
        return url.toString();

    }

}
package com.fcb.car.omssvc.api.dto;

import lombok.Data;

/**
 * @author liangqiuhua
 * @version 2.0
 */
@Data
public class OssInfoDto {
    private static final long serialVersionUID = 450333485671147827L;

    private String endpoint;
    private String bucketName;

}
aliyun:
  oss:
    pub:
      endpoint: https://oss-cn-XX.aliyuncs.com
      bucketDomain: oss-cn-XX.aliyuncs.com
      outerBucketDomain: oss-cn-XX.aliyuncs.com
      bucketName: devsit-XX-XX-XX-pub
      accessKeyId: XXXXXXXXXXX
      accessKeySecret: A6XXXXXXXXXXXRfXXzhXX
    pri:
      endpoint: https://oss-cn-shenzhen.aliyuncs.com
      bucketDomain: oss-cn-shenzhen.aliyuncs.com
      outerBucketDomain: oss-cn-shenzhen.aliyuncs.com
      bucketName: devsit-XX-pt-XX-pri
      accessKeyId: LTXXXXXXXXrcvznLXXX
      accessKeySecret: jXXXXXXXXYvTXXXXnkXXXX
    sts:
      pub:
        endpoint: sts.cn-shenzhen.aliyuncs.com
        bucketName: devsit-XX-pt-sale-pub
        bucketDomain: oss-cn-shenzhen.aliyuncs.com
        outerBucketDomain: oss-cn-shenzhen.aliyuncs.com
        accessKeyId: XXXXXXXXXXXXX
        accessKeySecret: XXXXXXXXXXXXXXXXXXXX
        roleArn: acs:ram::1580XXXX674X:role/XXXX
        roleSessionName: devsit-XX-pt-sale-pri
      pri:
        endpoint: sts.cn-shenzhen.aliyuncs.com
        bucketName: devsit-car-pt-sale-pri
        bucketDomain: oss-cn-shenzhen.aliyuncs.com
        outerBucketDomain: oss-cn-shenzhen.aliyuncs.com
        accessKeyId: XXXXXXXXXXXXXXXXXX
        accessKeySecret: XXXXXXXXXXXXXXXXXXXX
        roleArn: acs:ram::158078XXXXXXXX336XX:role/XXXX
        roleSessionName: devsit-XX-pt-sale-pri

pom.xml

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

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用 Go 语言实现的阿里云 OSS文件上传的示例代码: ``` package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { // 配置 OSS 客户端 endpoint := "yourEndpoint" accessKeyID := "yourAccessKeyID" accessKeySecret := "yourAccessKeySecret" bucketName := "yourBucketName" client, err := oss.New(endpoint, accessKeyID, accessKeySecret) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 获取存储空间 bucket, err := client.Bucket(bucketName) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 设置并发上传的协程数 oss.SetConcurrency(50) // 上传文件列表 fileList := []string{ "/path/to/file1", "/path/to/file2", "/path/to/file3", } // 遍历文件列表进行上传 for _, filePath := range fileList { // 打开文件 file, err := os.Open(filePath) if err != nil { fmt.Println("Error:", err) continue } defer file.Close() // 创建 ObjectMeta meta := oss.ObjectMeta{} // 上传文件 objectKey := "yourObjectKeyPrefix/" + filepath.Base(filePath) err = bucket.PutObject(objectKey, file, meta) if err != nil { fmt.Println("Error:", err) continue } fmt.Println("File uploaded successfully:", filePath) } } ``` 在使用该代码前,您需要先将 `yourEndpoint`、`yourAccessKeyID`、`yourAccessKeySecret` 和 `yourBucketName` 替换成您自己的阿里云 OSS 相关信息。此外,您还需要修改 `fileList` 变量,将其中的文件路径替换成您想要上传的文件路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值