数据库改动
因为第一个版本是存储在本地,这个版本是存储在阿里云,所以数据库拆分了
OSS引入
public String uploadfile(MultipartFile file,String destFileName)方法,传入的MultipartFile是前端传入的文件数据,用这个file去获取InputStream,把输入流放入putObject方法的形参中,连同定义的文件名,桶名一起传入到云端
public class OSSnxbPhoto {
//以下配置也可以直接写进方法中,写这里算全局配置
public static String endpoint = "https://oss-cn-shanghai.aliyuncs.com";
public static String accessKeyId = "LTAI5tGTPZEjjs7pfMQsQXZ5";
public static String accessKeySecret = "LxYKPs6m3EAQldJtopxWyQsJV4XSVA";
public static String bucketName = "nxb-photo";
//文件上传,返回一个url字符串
public String uploadfile(MultipartFile file,String destFileName){
String objectName = destFileName;
OSS ossClient = null;
try {
// 创建OSSClient实例,用于跟阿里云交互:根据3个属性创建
ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//获取文件流
InputStream inputStream = file.getInputStream();
//上传:putObject
ossClient.putObject(bucketName, objectName,inputStream);
} catch (Exception e){
e.printStackTrace();
} finally {
// 关闭OSSClient。
ossClient.shutdown();
}
//拼接url:
String url = "https://" + bucketName + ".oss-cn-shanghai.aliyuncs.com/"
+ destFileName;
return url;
}
}
Controller层修改
-
因为引入了对photo数据表单的控制,要@Autowried
-
前端传来一堆文件,但是主体信息(位置 标签 内容等)是唯一的,所以只有文件相关的放在for循环里,多次提交给云端,多次提交给数据库存储路径
-
根据时间戳生成唯一的infoid(s)
-
根据时间戳生成多个photo的名字,url路径(b)
@RestController @RequestMapping("pushinfo") public class PushInfoController { @Autowired IMPPushInfoService impPushInfoService; @Autowired IMPPhotoService impPhotoService; /* * 存储信息的PushInfo类只save一次 * 存储照片的Photo根据for循环决定save多少次 * */ //发布内容 @PostMapping("{id}") public R pushinfo(@PathVariable Integer id , @RequestParam ("files") List<MultipartFile> files, @RequestParam("info") String infomation, @RequestParam("tag") String tag, @RequestParam("location") String location){ //千万不能给PushInfo加@RequestBody //从路径获取id,根据主键id存储;获取多条上传的文件list;获取PushInfo对象 PushInfo pushInfo = new PushInfo(); pushInfo.setId(id); pushInfo.setInfomation(infomation); pushInfo.setTag(tag); pushInfo.setLocation(location); long l = System.currentTimeMillis(); String s = Long.toString(l); pushInfo.setPushinfoid(s);//根据当前时间生成唯一一个发布的动态的id R r = new R();//返回给前端的Result OSSnxbPhoto oss = new OSSnxbPhoto();//oss实例,以存入阿里云并返回url for(MultipartFile f : files) {//对每个文件进行存储Photo中,并设置好url //对于另外一个表,存储图像,也要实例化bean Photo photo = new Photo(); photo.setInfoid(s);//存储图片的infoid也要一致,所以用的是‘s’ String ss = f.getOriginalFilename().substring(f.getOriginalFilename().lastIndexOf("."));//拿到文件格式,如png jpg long a = System.currentTimeMillis();//再次生成当前时间戳,每进行一次for就生成一次 String b = Long.toString(a); String destFileName = b + ss;//根据时间戳生成存储在oss的文件名,唯一 //根据目标文件名 和 文件f 调用OSS的方法,并返回url字符串 String desturl = oss.uploadfile(f, destFileName); photo.setPhotourl(desturl); impPhotoService.save(photo); } r.setFlag(impPushInfoService.save(pushInfo)); if(r.getFlag()==true) { r.setMsg("已发布"); r.setData(pushInfo);//包括了从前端传来的位置,标签,信息内容 }else{ r.setMsg("发布失败"); } /* * 这里设置的fileName属性是一个唯一的,相对的路径 * 所以在取的时候,也需要相对取 * */ return r; } }