NXB-oss存储图片v2

该博客介绍了如何在SpringBoot应用中整合阿里云OSS服务进行文件上传,并将文件信息存储到数据库。通过创建OSSClient实例,使用MultipartFile从前端接收文件,然后将文件上传到阿里云OSS并获取URL。同时,更新数据库中的PushInfo和Photo表,确保信息和文件路径的一致性。
摘要由CSDN通过智能技术生成

数据库改动

因为第一个版本是存储在本地,这个版本是存储在阿里云,所以数据库拆分了

存储照片的没有主键
存储动态的不存照片路径

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;
      
          }
      }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值