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;
}
}
上传文件到阿里的OSS服务器之其中两种办法
最新推荐文章于 2025-03-08 16:50:37 发布