Java 项目开发中阿里云 oss上传本地到服务器以及下载功能实现实例。
AliyunOSSUtil类:
public class AliyunOSSUtil {
/**
* 该示例代码展示了如果在OSS中创建和删除一个Bucket,以及如何上传和下载一个文件。
*
* 该示例代码的执行过程是:
* 1. 创建一个Bucket(如果已经存在,则忽略错误码);
* 2. 上传一个文件到OSS;
* 3. 下载这个文件到本地;
* 4. 清理测试资源:删除Bucket及其中的所有Objects。
*
* 尝试运行这段示例代码时需要注意:
* 1. 为了展示在删除Bucket时除了需要删除其中的Objects,
* 示例代码最后为删除掉指定的Bucket,因为不要使用您的已经有资源的Bucket进行测试!
* 2. 请使用您的API授权密钥填充ACCESS_ID和ACCESS_KEY常量;
* 3. 需要准确上传用的测试文件,并修改常量uploadFilePath为测试文件的路径;
* 修改常量downloadFilePath为下载文件的路径。
* 4. 该程序仅为示例代码,仅供参考,并不能保证足够健壮。
*
*/
private static final String ACCESS_ID = "cvj2e9aH*****";
private static final String ACCESS_KEY = "KFdm4MeaT******";
private static final String endPoint = "http://oss-cn-beijing.aliyuncs.com";
private static final String bucketName = "x******";
// 设置URL过期时间为1天
private static final Date expiration = new Date(new Date().getTime() + 3600 * 1000 * 24);
//在自己内部定义自己的一个 实例,只供内部调用
private static final OSSClient client = new OSSClient(endPoint, ACCESS_ID, ACCESS_KEY);
private AliyunOSSUtil(){
//do something
}
//单例模式
//获得客户端
public static OSSClient getOSSClient(){
return client;
}
//创建一个Bucket
public static void ensureBucket()throws OSSException, ClientException{
try {
// 创建bucket, 判断bucket是否存在
boolean exists = client.doesBucketExist(bucketName);
if(!exists){
client.createBucket(bucketName);
}else{
}
} catch (ServiceException e) {
System.out.println(e.getErrorCode() + " " + e.getErrorMessage());
throw e;
}
}
// 获取指定bucket下的所有Object信息
public void getObjects(OSSClient client,String bucketName){
ObjectListing listing = client.listObjects(bucketName);
// 遍历所有Object
for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
System.out.println(objectSummary.getKey());
}
}
// 删除一个Bucket和其中的Objects
public static void deleteBucket(OSSClient client, String bucketName)
throws OSSException, ClientException {
ObjectListing ObjectListing = client.listObjects(bucketName);
List<OSSObjectSummary> listDeletes = ObjectListing.getObjectSummaries();
for (int i = 0; i < listDeletes.size(); i++) {
String objectName = listDeletes.get(i).getKey();
// 如果不为空,先删除bucket下的文件
client.deleteObject(bucketName, objectName);
}
client.deleteBucket(bucketName);
}
// 把Bucket设置为所有人可读
public static void setBucketPublicReadable(OSSClient client, String bucketName)
throws OSSException, ClientException {
//创建bucket
client.createBucket(bucketName);
//设置bucket的访问权限,public-read-write权限
client.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
}
// 上传文件 file
public static void uploadFile(String key, File file) throws OSSException, ClientException, FileNotFoundException {
// 获取指定文件的输入流
InputStream content = new FileInputStream(file);
// 创建上传Object的Metadata
<span style="white-space:pre"> </span> ObjectMetadata meta = new ObjectMetadata();
// 必须设置ContentLength
meta.setContentLength(file.length());
meta.setContentType("image/*");
client.putObject(bucketName, key, content, meta);
}
// 上传文件 MultipartFile multipartFile
public static void uploadMultipartFile(String key, MultipartFile multipartFile) throws OSSException, ClientException, FileNotFoundException {
try {
// 获取指定文件的输入流
InputStream content = multipartFile.getInputStream();
// 创建上传Object的Metadata
ObjectMetadata meta = new ObjectMetadata();
// 必须设置ContentLength
meta.setContentLength(multipartFile.getSize() );
meta.setContentType("image/*");
client.putObject(bucketName, key, content, meta);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//生成URL
public static URL getUrl(String key){
URL url = client.generatePresignedUrl(bucketName, key, expiration);
return url;
}
// 下载文件
public static void downloadFile(OSSClient client, String bucketName, String key, String fileDownloadPath)
throws OSSException, ClientException {
client.getObject(new GetObjectRequest(bucketName, key), new File(fileDownloadPath));
}
//创建Bucket 里的虚拟文件夹
public static void createFileDir(String dir)throws OSSException, ClientException{
ensureBucket();
try {
client.getObject(bucketName, dir);
} catch (ServiceException e) {
// TODO Auto-generated catch block
if(e.getErrorCode().equals("NoSuchKey")){
//要创建的文件夹名称,在满足Object命名规则的情况下以"/"结尾
String objectName = dir + "/";
ObjectMetadata objectMeta = new ObjectMetadata();
/*这里的size为0,注意OSS本身没有文件夹的概念,这里创建的文件夹本质上是一个size为0的Object,dataStream仍然可以有数据 */
byte[] buffer = new byte[0];
ByteArrayInputStream in = new ByteArrayInputStream(buffer);
objectMeta.setContentLength(0);
try {
//创建文件上传目录
client.putObject(bucketName, objectName, in, objectMeta);
}catch(ServiceException se){
System.out.println(se.getErrorCode() + " " + se.getErrorMessage());
throw e;
}
finally {
try {
in.close();
} catch (IOException ioe) {
// TODO Auto-generated catch block
ioe.printStackTrace();
}
}
}
}
}
}