上传文件到阿里的OSS服务器之其中两种办法

package com.test.utils;
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.*;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
public  class OssUtil {
    private static String endpoint="";
    private static String accessKeyId="";
    private static  String accessKeySecret="";
    private static String bucketName = "";
    static {
        try {
            Resource resource = new ClassPathResource("/application.properties");
            Properties props = PropertiesLoaderUtils.loadProperties(resource);
            endpoint = props.getProperty("endpoint").toString();//登陆阿里云账号中获取
            accessKeyId = props.getProperty("accessKeyId").toString();//登陆阿里云账号中获取
            accessKeySecret = props.getProperty("accessKeySecret").toString();//登陆阿里云账号中获取
            bucketName = props.getProperty("bucketName").toString();//可以自己在oss浏览器上新建
        } catch (IOException e) {
            e.printStackTrace();

        }

    }
    public static String ossUplode(String filename, InputStream inputStream) {
   System.out.println("---------OssUtilsjt-----------"+endpoint);
        // Endpoint以杭州为例,其它Region请按实际情况填写。
//        String endpoint = "http://oss-cn-beijing.aliyuncs.com";//外网访问资源
       // String endpoint = "http://oss-cn-beijing-internal.aliyuncs.com";//内网访问资源
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常           ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
        conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒
        conf.setSocketTimeout(15 * 1000);// socket超时,默认15秒
        conf.setMaxConnections(10); // // 设置HTTP最大连接数为10
        conf.setMaxErrorRetry(2);// 失败后最大重试次数
     // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret,conf);
        // 上传文件。<yourLocalFile>由本地文件路径加文件名包括后缀组成,例如/users/local/myfile.txt。
        // 存储空间。
        // 存储空间。
       // String bucketName = "qingdao1z";
        //   ossClient.putObject(bucketName, "patient/"+filename, new File(filUrl));
        // 设置URL过期时间。
        // InputStream inputStream = new FileInputStream("<yourlocalFile>");
        ossClient.putObject(bucketName,  "文件夹路径/"+filename, inputStream);

        Date expiration = new Date(new Date().getTime() + 3600 * 1000 * 24 * 365 * 30);
// 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。
        String url = ossClient.generatePresignedUrl(bucketName,  "patient/"+filename, expiration).toString().replace("-internal", "");
//如果Bucket设置私有则缩略图不能直接在url中获取

  // 将图片缩放为固定宽高100 px。
//        String style = "image/resize,l_100";
//        GeneratePresignedUrlRequest req= new GeneratePresignedUrlRequest(bucketName,"patient/"+filename);
//
//        req.setExpiration(expiration);
//        req.setProcess(style);
//        String singdUrl=  ossClient.generatePresignedUrl(req).toString();
//
 关闭OSSClient。
//        ossClient.shutdown();
//        System.out.println("缩略图地址=="+singdUrl);
//        System.out.println("原图地址=="+url);

// 关闭OSSClient。
        ossClient.shutdown();
        return url;
    }
    /**
     * 分片上传
     * @param filename
     *
     * @return
     */
    public static String ossFpUplode(String filename, InputStream instream,MultipartFile sampleFile) {
        System.out.println("这是分片上传"+endpoint);

        // Endpoint以杭州为例,其它Region请按实际情况填写。
//        String endpoint = "http://oss-cn-beijing.aliyuncs.com";//外网访问
        // String endpoint = "http://oss-cn-beijing-internal.aliyuncs.com";//内网访问资源
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
         //String bucketName = "qingdao1z";
        String objectName = "文件夹路径/"+filename;
        String url ="";
// 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        /* 步骤1:初始化一个分片上传事件。
         */
        InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);
        InitiateMultipartUploadResult result = ossClient.initiateMultipartUpload(request);
// 返回uploadId,它是分片上传事件的唯一标识,您可以根据这个ID来发起相关的操作,如取消分片上传、查询分片上传等。
        String uploadId = result.getUploadId();

        /* 步骤2:上传分片。
         */
// partETags是PartETag的集合。PartETag由分片的ETag和分片号组成。
        List<PartETag> partETags =  new ArrayList<PartETag>();
// 计算文件有多少个分片。
        final long partSize = 1 * 1024 * 1024L;   // 1MB

        // final File sampleFile = new File("<localFile>");

        long fileLength = sampleFile.getSize();
        int partCount = (int) (fileLength / partSize);
        if (fileLength % partSize != 0) {
            partCount++;
        }
// 遍历分片上传。
        try {
            for (int i = 0; i < partCount; i++) {
                long startPos = i * partSize;
                long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
                // InputStream instream = new FileInputStream(sampleFile);
                // 跳过已经上传的分片。
                instream.skip(startPos);
                UploadPartRequest uploadPartRequest = new UploadPartRequest();
                uploadPartRequest.setBucketName(bucketName);
                uploadPartRequest.setKey(objectName);
                uploadPartRequest.setUploadId(uploadId);
                uploadPartRequest.setInputStream(instream);
                // 设置分片大小。除了最后一个分片没有大小限制,其他的分片最小为100KB。
                uploadPartRequest.setPartSize(curPartSize);
                // 设置分片号。每一个上传的分片都有一个分片号,取值范围是1~10000,如果超出这个范围,OSS将返回InvalidArgument的错误码。
                uploadPartRequest.setPartNumber( i + 1);
                // 每个分片不需要按顺序上传,甚至可以在不同客户端上传,OSS会按照分片号排序组成完整的文件。
                UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
                // 每次上传分片之后,OSS的返回结果会包含一个PartETag。PartETag将被保存到partETags中。
                partETags.add(uploadPartResult.getPartETag());
            }
            /* 步骤3:完成分片上传。
             */
// 排序。partETags必须按分片号升序排列。
            Collections.sort(partETags, new Comparator<PartETag>() {
                public int compare(PartETag p1, PartETag p2) {
                    return p1.getPartNumber() - p2.getPartNumber();
                }
            });
// 在执行该操作时,需要提供所有有效的partETags。OSS收到提交的partETags后,会逐一验证每个分片的有效性。当所有的数据分片验证通过后,OSS将把这些分片组合成一个完整的文件。
            CompleteMultipartUploadRequest completeMultipartUploadRequest =
                    new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);
            ossClient.completeMultipartUpload(completeMultipartUploadRequest);
            Date expiration = new Date(new Date().getTime() + 3600 * 1000 * 24 * 365 * 30);
// 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。
            url = ossClient.generatePresignedUrl(bucketName,  objectName, expiration).toString();
             url = url = url.replace("-internal", "");//如果是内网存入的返回的地址要截取拼接成公网保存数库
// 关闭OSSClient。
    } catch (IOException e) {
            e.printStackTrace();
        }finally {
         ossClient.shutdown();

            partETags.clear();
            partETags = null;
        }

        return url;
    }
   
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值