在和一群大佬做react native项目的时候,我负责的是前端的工作。项目中有个功能涉及到图片的上传,当时还不清楚什么是对象存储。开始看官方文档,学习!GitHub中有react native 阿里云的sdk,大家有兴趣的话可以在GitHub上搜索一下。开始是前端进行对象存储的工作,这个项目进行了一段时间后,这个工作改为了后端完成(前端做这件事会暴漏key 和 secret,不安全)我向大佬要来了后台(Java实现)代码,简单把对象存储的模块剥离出来了,希望能对大家有用处吧(我只是个知识的搬运工哈哈)
需要准备的东西
可以将这些信息放在一个配置文件里面
ossclient.endPoint=oss-cn-beijing.aliyuncs.com
ossclient.accessKeyId=你的key
ossclient.accessKeySecret=你的secret
ossclient.bucketName=bucket的名字
ossclient.folder=图片存在的文件夹
编码
代码是参照阿里云官方编写的 点击查看,使用SpringBoot框架实现
源代码可以去我的 GitHub 上clone
- 匹配信息的类,初始化
package com.skyocean.entity;
import com.aliyun.oss.OSSClient;
import java.util.ResourceBundle;
public class OSSConfigure {
private static OSSConfigure ossConfigure;
private String endPoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
private String folder;
private OSSConfigure () {
ResourceBundle rb = ResourceBundle.getBundle("OSSClient");
{
endPoint = rb.getString("ossclient.endPoint");
accessKeyId = rb.getString("ossclient.accessKeyId");
accessKeySecret = rb.getString("ossclient.accessKeySecret");
bucketName = rb.getString("ossclient.bucketName");
folder = rb.getString("ossclient.folder");
}
}
private OSSConfigure (String folderNow) {
ResourceBundle rb = ResourceBundle.getBundle("OSSClient");
{
endPoint = rb.getString("ossclient.endPoint");
accessKeyId = rb.getString("ossclient.accessKeyId");
accessKeySecret = rb.getString("ossclient.accessKeySecret");
bucketName = rb.getString("ossclient.bucketName");
folder = folderNow;
}
}
public static OSSConfigure getOssConfigure() {
if (ossConfigure == null) {
synchronized (OSSConfigure.class) {
if (ossConfigure == null) {
ossConfigure = new OSSConfigure();
}
}
}
return ossConfigure;
}
public static OSSConfigure getOssConfigureSetFolder(String folderNow) {
if (ossConfigure == null) {
synchronized (OSSConfigure.class) {
if (ossConfigure == null) {
ossConfigure = new OSSConfigure(folderNow);
}
}
}
return ossConfigure;
}
public String getBucketName() {
return bucketName;
}
public String getFolder() {
return folder;
}
public OSSClient getOSSClient() {
return new OSSClient(endPoint, accessKeyId, accessKeySecret);
}
}
- controller 层编写
package com.mgl.controller;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.ObjectMetadata;
import com.mgl.entry.OSSConfigure;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
@RequestMapping("/pic")
@RestController
public class PictureController {
@PostMapping(value = "/uploadPic")
public Map<String, Object> uploadPic(
HttpServletRequest request,
String title,
MultipartFile[] pictures,
String description
) {
Map<String,Object> map = new HashMap<>();
System.out.println(title);
//开始上传
OSSClient ossClient = null;
try {
//得到上传到的文件夹
OSSConfigure ossConfigure = OSSConfigure.getOssConfigureSetFolder("test/");
//创建OSSClient
ossClient = ossConfigure.getOSSClient();
//判断文件夹是否存在,不存在则创建
if (!ossClient.doesObjectExist(ossConfigure.getBucketName(), ossConfigure.getFolder())) {
//创建文件夹
ossClient.putObject(ossConfigure.getBucketName(), ossConfigure.getFolder(), new ByteArrayInputStream(new byte[0]));
}
for (MultipartFile file: pictures
) {
String fileExtension = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
String key = ossConfigure.getFolder() +"mgl: "+ System.currentTimeMillis() + fileExtension;//key
InputStream fileInput = file.getInputStream();
//创建上传Object的Metadata
ObjectMetadata metadata = new ObjectMetadata();
//上传的文件的长度
metadata.setContentLength(fileInput.available());
//指定该Object被下载时的网页的缓存行为
metadata.setCacheControl("no-cache");
//指定该Object下设置Header
metadata.setHeader("Pragma", "no-cache");
//设置文件的上传名称
metadata.setContentDisposition("mgl: filename=\"" + System.currentTimeMillis() + "\"");
ossClient.putObject(ossConfigure.getBucketName(), key, fileInput);
}
map.put("msg","success !");
} catch (IOException e) {
e.printStackTrace();
map.put("msg","failed !");
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return map;
}
}
- 测试
好了,大功告成,希望能帮到大家,嘿嘿。