- 第一步配置oss yml文件
- 然后写个配置类,读取该文件, 也可以直接使用@value("${oss.xxxx}") 去在任何类里面拿到这个数据
- 多个yml文件使用@peopertiesSouce(value="classPath:")来指定yml文件
- 然后使用
@ConfigurationProperties(prefix = "oss") private String endpointBJ; 这里代表在OSS下面的endpointBJ endpointBJ和yml里面的配置名字一样,则可以映射上
@Component
public class AliyunConfig implements InitializingBean {
//如果我们直接@value("a")是把a赋值给endpoint
//所以我们需要使用spring提供的一个方法"${a}"来获取a对应的值
@Value("${aliyun.endpointBJ}")
private String endpointBJ;
@Value("${aliyun.endpointSZ}")
private String endpointSZ;
@Value("${aliyun.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.accessKeySecret}")
private String accessKeySecret;
@Value("${aliyun.bucketBJ}")
private String bucketBJ;
@Value("${aliyun.bucketSZ}")
private String bucketSZ;
//这些值赋值好了但是我们没用办法直接使用的。
//我们可以设置一些staic静态变量,这样就可以直接用类名.来调用了
public static String BUCKETBJ;
public static String BUCKETSZ;
public static String ENDPOINTBJ;
public static String ENDPOINTSZ;
public static String ACCESSKEYID;
public static String ACCESSKEYSECRET;
//服务器启动就会初始化ConstantYmlUtils并且调用afterPropertiesSet方法读取配置文件的内容
@Override
public void afterPropertiesSet() throws Exception {
BUCKETBJ = bucketBJ;
BUCKETSZ = bucketSZ;
ENDPOINTBJ = endpointBJ;
ENDPOINTSZ = endpointSZ;
ACCESSKEYID = accessKeyId;
ACCESSKEYSECRET = accessKeySecret;
}
或者我可以直接在这里用
@bean
private oss returnOss(a,b,c){
new一个OSS的实例返回出去,
//这样在service里面直接使用
@autowrid
private AliyunConfig ac ;
就直接可以拿到已经连接过的OSS
}
}
- 编写service连接OSS
// ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
OSS ossClient = new OSSClientBuilder().build(AliyunConfig.ENDPOINTBJ, AliyunConfig.ACCESSKEYID, AliyunConfig.ACCESSKEYSECRET);
//这里bucketName是yml里面的配置的, strDateList[0] 代表的是你需要下载的文件名
OSSObject ossObject = ossClient.getObject(bucketName, strDateList[0]);
//获取输入流
InputStream input = ossObject.getObjectContent();
//获取ZIP输入流,这里我指定了缓存的空间为10兆,因为我这边数据量很大,然后就是编码格式
GBK 乱码就用UTF-8换着是试一下 ,
ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(input, 10 * 1024), Charset.forName("GBK"));
//定义ZipEntry置为null,避免由于重复调用zipInputStream.getNextEntry造成的不必要的问题
ZipEntry ze = null;
//循环遍历
while ((ze = zipInputStream.getNextEntry()) != null) {
//读取
BufferedReader br = new BufferedReader(new InputStreamReader(zipInputStream));
String line;
while ((line = br.readLine()) != null) {
//这里就取到了字符串line,你里面可能存的是别的东西,我这里是json字符串
}
//每一次循环都关闭,不然会内存溢出,我指特别大的数据量
zipInputStream.closeEntry();
}
//循环结束关闭整个流
input.close();