携手创作,共同成长!这是我参与「掘金日新计划 · 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验证
批量上传歌曲
我们可以将参数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);
}
验证:
上传音乐模块总结
-
上传包括服务器和数据库上传
-
这里上传文件用到了
Spring框架中处理文件上传的主要类MulitspartFile类,这个类主要实现的是前端用表单的方式进行提交! -
上传服务器时要验证音乐是否重复上传,这里通过查询数据库中的信息进行验证
-
在上传音乐时验证是否为
MP3文件,我们通过MP3文件结构中的最后128个字节下有一个TAG标签即可验证