基于SpringBoot的online_music_player(上传音乐模块_4)

241 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情 

一个用户重复上传一首歌曲解决

显然我们的上传功能还有待优化,我们需要解决一个用户多次上传一首歌曲的行为!

在验证用户登入的行为后,再进行该用户上传的音乐文件是否已经上传过的验证

  • 我们通过查询数据库信息,从而验证

MusicMapper接口

 /**
     * 通过用户id和音乐信息验证是否重复上传
     * @param title
     * @param singer
     * @param user_id
     * @return
     */
    Music getMusicByUidAndMusicInfo(String title, String singer, int user_id);
}

xml实现

 <select id="getMusicByUidAndMusicInfo" resultType="com.example.onlinemusic.model.Music">
        select * from music where
        title=#{title} and singer=#{singer} and user_id=#{user_id}
    </select>

Controller重复上传验证

 //上传歌曲前验证歌曲是否已经存在!
        String title = musicname.substring(musicname.lastIndexOf(".mp3"));
        //获取到当前用户id
        User user = (User)session.getAttribute(Contant.USERINFO_SESSION_KEY);
        int user_id = user.getId();
       Music music = musicMapper.getMusicByUidAndMusicInfo(title,singer,user_id);
       if(music!=null){ //说明该歌曲重复上传
           System.out.println("重复上传");
           return new ResponseBodyMessage<>(-1,"上传失败,歌曲已存在",false);
       }

postman验证

image-20220729150224406

image-20220729150340098

批量上传歌曲

我们可以将参数file改成MulitspartFile的数组,就可以一次性批量上传多首歌曲

但是我们这里的歌手信息就无法全部上传咯!

 //实现支持多个文件上传就将MultipartFile改成数组即可!
    @RequestMapping("/uploads")
    public ResponseBodyMessage<Boolean> UploadMusics(@RequestParam(defaultValue = "未知歌手") String singer,
                                                    @RequestParam(value = "filename") MultipartFile[] files,
                                                    HttpServletRequest request){
​
        //1.上传音乐前验证登入状态,如果未登入就不创建会话
        //如果用户已登入,则允许上传音乐!
        HttpSession session = request.getSession(false);
        if(session==null||session.getAttribute(Contant.USERINFO_SESSION_KEY)==null){
            //未登入状态!
            System.out.println("未登入");
            return new ResponseBodyMessage<>(-1,"未登录,请登录后上传!",false);
        }
        //2.登入状态,可以将歌曲上传到服务器!
​
        //保存上传失败的歌曲信息
        StringBuilder uploadfailinfo = new StringBuilder();
        for (MultipartFile file:files) {
​
            //获取到音乐文件名  xxx.mp4
            String musicname = file.getOriginalFilename();
            System.out.println("musicfileAndtype:"+musicname);
​
            //上传歌曲前验证歌曲是否已经存在!
            String title = musicname.substring(0,musicname.lastIndexOf(".mp3"));
            //获取到当前用户id
            User user = (User)session.getAttribute(Contant.USERINFO_SESSION_KEY);
            int user_id = user.getId();
            Music music = musicMapper.getMusicByUidAndMusicInfo(title,singer,user_id);
            if(music!=null){ //说明该歌曲重复上传
                System.out.println(title+"已存在");
                //保存歌曲信息,用于返回前端用户!
                uploadfailinfo.append(title+",");
                //进行下一首歌曲上传
                continue;
            }
            //歌曲未上传
            //上传文件在服务器下保存的路径!
            String path = SAVE_PATH + musicname;
            //创建文件对象
            File dest = new File(path);
            //该文件目录在磁盘中不存在,就创建该目录
            if(!dest.exists()){
                dest.mkdir();
                System.out.println("mkdir"+dest);
            }
            //将音乐文件上传到该目录下!
            try {
                file.transferTo(dest);
                System.out.println(dest);
            } catch (IOException e) {
                e.printStackTrace();
                //上传失败
                return new ResponseBodyMessage<>(-1,"服务器上传失败",false);
            }
            //服务器上传成功,我们就需要对数据库进行上传信息!
​
            //1.数据准备
            //1).title 通过文件名截取到歌名,验证上传重复上传时已获取title
            //String title = musicname.substring(0,musicname.lastIndexOf(".mp3"));
            //2).singer 直接获取用户上传的 singer
            //3).time
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
            String time = simpleDateFormat.format(new Date());
            //4).url 可以通过拼接! eg: music/get?path=隆里电丝
            String url = URL_PRE+title;
            //5).user_id 通过当前session获取,验证重复上传时已获取
//        User user = (User)session.getAttribute(Contant.USERINFO_SESSION_KEY);
//        int user_id = user.getId();
            int ret = musicMapper.upload(title,singer,time,url,user_id);
            if(ret!=1){//上传失败!
                //我们数据库上传失败,那么就需要将服务器下的该音乐文件删除
                System.out.println("服务器上传成功,数据库上传失败,删除服务器下文件");
                dest.delete();
                return new ResponseBodyMessage<>(-1,"数据库上传失败",false);
            }
​
        }
        if(uploadfailinfo.length()==0) {
            //说明全部歌曲上传成功!
            return new ResponseBodyMessage<>(0, "上传成功", true);
        }
        //部分歌曲上传失败
        return new ResponseBodyMessage<>(0,"歌曲:"+uploadfailinfo+"已存在,上传失败,"+"其他歌曲上传成功",true);
    }

验证:

image-20220801124134954

上传音乐模块总结

  • 上传包括服务器和数据库上传

  • 这里上传文件用到了Spring框架中处理文件上传的主要类MulitspartFile类,这个类主要实现的是前端用表单的方式进行提交!

    image-20220729230213100

  • 上传服务器时要验证音乐是否重复上传,这里通过查询数据库中的信息进行验证

  • 在上传音乐时验证是否为MP3文件,我们通过MP3文件结构中的最后128个字节下有一个TAG标签即可验证