阿里对象存储 OSS 文件上传下载,图片上传java
前言
此文档代码丢失了,有些代码和实际你的需求会不一样,但是我写的代码是对的,请根据需求修改。
阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以使用阿里云提供的 API、SDK 接口或者 OSS 迁移工具轻松地将海量数据移入或移出阿里云 OSS。数据存储到阿里云 OSS 以后,您可以选择标准类型(Standard)的阿里云 OSS 服务作为移动应用、大型网站、图片分享或热点音视频的主要存储方式,也可以选择成本更低、存储期限更长的低频访问类型(Infrequent Access)和归档类型(Archive)的阿里云 OSS 服务作为不经常访问数据的备份和归档。
创建oss 空间
阿里网站 https://oss.console.aliyun.com
登录之后,点击控制台
mantianluanwu就是我的储存空间名称,新建的没有
注意:首次打开不是这个页面,阿里会让你开通一下。开通之后,要等几分钟才能用,者之间的教程就没有了,应为我是很早就弄得。按照提示来吧。,下载的时候,把文件名传到页面,页面把值传到方法里面。应为我们的文件是私有的,文件的路径有秘钥,他的url是会变得。
注意支持jdk 1.8或1.8以上的
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.8.3</version>
</dependency>
如果不是maven项目请自行前去寻找,地址如下
https://help.aliyun.com/document_detail/32009.html?spm=a2c4g.11186623.6.743.8d6fc06dp6ozco
上传
读写权限要设置为私有
public static void shangchuan() throws IOException {
String endpoint = "http://oss-cn-beijing.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = "L*********SD";
String accessKeySecret = "ExCm***************wcHF";
String bucketName = "*******";
String objectName = "456.txt";
//objectName 上传文件名
// 创建OSSClient实例。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 上传内容到指定的存储空间(bucketName)并保存为指定的文件名称(objectName)。
String content = "Hello OSS";
//content 上传文件内容
ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
// 关闭OSSClient。
ossClient.shutdown();
}
下载
urlString:页面传过来的文件名
只要你调这个方法,页面上就会让你选择下载路径
public static void fujianxiazai(HttpServletRequest request,HttpServletResponse response,String urlString) throws IOException {
String endpoint = "*****************";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = "*************";
String accessKeySecret = "******************";
String bucketName = "************";
String objectName = urlString;
response.reset();
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition","attachment;filename=" + new String(objectName.getBytes("utf-8"),"ISO8859-1"));
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>oss下载<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
String key = objectName.toString();
key = key.replaceAll("\\\\", "/");
OSSObject object = ossClient.getObject(bucketName, key);
BufferedInputStream input = new BufferedInputStream(object.getObjectContent());
byte[] buffBytes = new byte[1024];
OutputStream outputStream = response.getOutputStream();
int read = 0;
while ((read = input.read(buffBytes)) != -1) {
outputStream.write(buffBytes, 0, read);
}
outputStream.flush();
outputStream.close();
//is.close();
input.close();
ossClient.shutdown();
}
前端代码
<input type="button" onclick="downloadImage()" value="下载">
<script>
function downloadImage(){
location.href="controller方法地址+文件名";
}
</script>
这个代码没有连接数据库,如果连接数据库后,前端向后端传一个下载的文件名objectName 后端接收一下就可以了
String endpoint :请根据自己的地址进行修改,不同的区域这个值不一样https://help.aliyun.com/document_detail/31837.html?spm=a2c4g.11186623.2.18.39be45dcOqIV4g#concept-zt4-cvy-5db
图片上传和遍历
图片上传
图片上传的代码我没有写他和文件上传的代码一样,首先我们上传图片最后遍历我们要知道图片的路径。但是oss对于图片返回url,Bucket 私有的话返回的url有时长限制,可以把Bucket 设置为共读,此时他的路径就不会变了。数据库中存的还是图片名加后缀。
遍历
https:// + 储存空间名称.+ endpoint + /文件名
例子
https://mantianluanwu.oss-cn-beijing.aliyuncs.com/17-150122104305.jpg
这就是你的图片路径
返回url方法
public static void fanhuiurl() {
// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = "http://oss-cn-beijing.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = "***************";
String accessKeySecret = "**************";
String bucketName = "**************";
String objectName = "**************";
// 创建OSSClient实例。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 设置URL过期时间为1小时。
Date expiration = new Date(new Date().getTime() + 3600 * 1000);
// 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。
URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
String ww=url.toString();
String wenwen = ww.substring(0,ww.lastIndexOf('?'));
System.out.println(url);
// 关闭OSSClient。
ossClient.shutdown();
}
endpoint 一定要看这个,记着这个词,看这个
你创建的区域不一样,他endpoint 也是不一样的。具体的在下面的网址上面找。选择外网Endpoint
https://help.aliyun.com/document_detail/31837.html?spm=a2c4g.11186623.2.18.39be45dcOqIV4g#concept-zt4-cvy-5db