ssm实现视频的上传与播放的示例代码

网友投稿 268 2023-01-21

ssm实现视频的上传与播放的示例代码

实现的功能:

1:实现视频的上传与播放。

2:使用shiro框架进行登录注册。

3:视频分页展示在页面上。

4:视频简介

5:视频评论

6:发表评论

简单介绍一下大概实现的思路:

首先主要的功能就是实现视频的上传与播放,那么我们就需要一个视频上传的界面,选择视频进行上传,那么上传到哪儿呢?

这里我们有多重选择,第一:我们可以将视频转换格式存在我们tomcat服务器里面,然后在数据库里面存入tomcat中对应的文件的路径。第二:我们可以使用nginx来存储我们的网页的静态资源。今天我就介绍上面一个简单的。

对于视频的简介,评论,以及发表评论无非就是对数据库中进行增删改查。

那么我们下面就来简单的介绍一下核心代码。

视频上传:

@RequestMapping(value = "dofunction", method = RequestMethod.POST)

public void handler(HttpServletRequest request, HttpServletResponse response,

@RequestParam("myvideo") MultipartFile file) throws IOException {

String message = "";

try {

Video media = new Video();

// 解析数据

media.setName(request.getParameter("name"));

media.setDescription(request.getParameter("description"));

boolean flag = false; // 转码成功与否的标记

// 上传文件

ServletContext nluKuRsctx = request.getServletContext();

// 获得保存文件的路径

String basePath = sctx.getRealPath("videos");

// 获得文件名

String fileUrl = file.getOriginalFilename();

// 在某些操作系统上,item.getName()方法会返回文件的完整名称,即包括路径

String fileType = fileUrl.substring(fileUrl.lastIndexOf(".")); // 截取文件格式

// 自定义方式产生文件名

String serialName = String.valueOf(System.currentTimeMillis());

// 待转码的文件

File uploadFile = new File(basePath + "/temp/" + serialName + fileType);

// 保存文件

Streams.copy(file.getInputStream(),new FileOutputStream(uploadFile.getAbsolutePath()),true);

// 判断文件的大小

if (file.getSize() > 500 * 1024 * 1024) {

message = "上传失败!您上传的文件太大,系统允许最大文件500M";

}

String codcFilePath = basePath + "/" + serialName + ".flv"; // 设置转换为flv格式后文件的保存路径

String mediaPicPath = basePath + "/images" + File.separator + serialName + ".jpg"; // 设置上传视频截图的保存路径

// 获取配置的转换工具(ffmpeg.exe)的存放路径

String ffmpegPath = request.getServletContext().getRealPath("/tools/ffmpeg.exe");

media.setAddress("videos/" + serialName + ".flv");

media.setPicture("videos/images/" + serialName + ".jpg");

media.setUptime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(System.currentTimeMillis())));

// 转码

flag = serviceFactory.getMediaService().executeCodecs(ffmpegPath, uploadFile.getAbsolutePath(),

codcFilePath, mediaPicPath);

if (flag) {

// 转码成功,向数据表中添加该视频信息

serviceFactory.getMediaService().saveMedia(media);

message="上传成功";

}

request.setAttribute("message", message);

} catch (Exception e) {

e.printStackTrace();

}

MyWebPrinter.print(response,"");

}

视频播放:

@RequestMapping("play")

public String play(int id, HttpServletRequest request, HttpServletResponse responshttp://e) throws ServletException, IOException {

String idstr = id + "";

int mediaId = -1;

Video media = null;

if (null != idstr) {

mediaId = Integer.parseInt(idstr);

}

try {

media = serviceFactory.getMediaService().queryMediaById(mediaId);

System.out.println(media.toString());

} catch (Exception e) {

e.printStackTrace();

}

request.setAttribute("media", media);

return "video-detail";

}

用户使用shiro安全框架进行登录:

public class ShiroRealm extends AuthorizingRealm{

@Autowired

UserService userService;

protected AuthenticationInfo doGetAuthenticationInfo

(AuthenticationToken authenticationToken) throws AuthenticationException {

//此处的authenticationToken和nluKuRcontroller中的UsernamePasswordToken是同一个,是controller中传过来的

//System.out.println("doGetAuthenticationInfo " + authenticationToken.hashCode());

//1. 把 AuthenticationToken 转换为 UsernamePasswordToken

UsernamePasswordToken upToken = (UsernamePasswordToken) authenticationToken;

//2. 从 UsernamePasswordToken 中来获取 username

String username = upToken.getUsername();

//3. 调用数据库的方法, 从数据库中查询 username 对应的用户记录(登录名和密码)

//System.out.println("从数据库中获取 username: " + username + " 所对应的用户信息.");

User user = userService.findUserByEmail(username);

System.out.println(user.getEmail() + ", " + user.getPassword());

//4. 若用户不存在, 则可以抛出 UnknownAccountException 异常

// if("unknown".equals(username)){

// throw new UnknownAccountException("用户不存在!");

// }

//5. 根据用户信息的情况, 决定是否需要抛出其他的 AuthenticationException 异常

// if("monster".equals(username)){

// throw new LockedAccountException("用户被锁定");

// }

//6. 根据用户的情况来构建 AuthenticationInfo对象并返回 通常用的实现类为: SimpleAuthenticationInfo

//以下信息是从数据库中获取的.

//(1). principal : 认证的实体信息 可以是 username 也可以是数据表对应的用户的实体类对象

Object principal = username;

//(2). credentials : 密码.

Object credentials = null;

if(user.getEmail().equals(username)){

credentials = user.getPassword();

}

//(3). realmName : 当前realm对象的name 调用父类的getName()方法即可

String realmName = getName();

//(4). salt : 盐值 这里用username作为盐值 因为用户名是唯一的

ByteSource salt = ByteSource.Util.bytes(username);

SimpleAuthenticationInfo info = null;

info = new SimpleAuthenticationInfo(principal,credentials,salt,realmName);

return info;

}

//测试获取加密后的密码 本例原密码123456,加密2次

public static void main(String[] args) {

String hashAlgorithmName = "MD5";

Object credentials = "123456";

//Object salt = ByteSource.Util.bytes("lewy@9.com");//9be0a8423bbe47b9ab62b964d0e5b434

Object salt = ByteSource.Util.bytes("muller@25.com");//9c377556e3611b4e4fe3d844f1a7135a

int hashIterations = 2;

//将一个字符串进行MD5加密

Object result = new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations);

System.out.println(result);

}

//授权会被shiro回调的方法

protected AuthorizationInfo doGetAuthorizationInfo

(PrincipalCollection principalCollection) {

//1. 从 PrincipalCollection 中来获取登录用户的信息

// 注意如果是多realm,获取的principal也是有顺序的

Object principal = principalCollection.getPrimaryPrincipal();

//2. 利用登录的用户的信息来查用户当前用户的角色或权限(可能需要查询数据库)

User_Role user_role = userService.findUserRoleByEmail((String) principal);

System.out.println("角色为:" + user_role.getRole_name());

Set roles = new HashSet();

roles.add("user");//给所有用户添加user权限

if(user_role.getRole_name().equals("admin")){

roles.add(user_role.getRole_name());//如果用户的角色是admin,再添加一个admin权限

}

//3. 创建 SimpleAuthorizationInfo, 并设置其 roles 属性.

SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roles);

//4. 返回 SimpleAuthorizationInfo 对象.

return info;

}

页面展示:

实现的过程,controller调用service中的方法,将结果呈现给在jsp页面上,然后service层调用dao层中的对数据库操作的方法。

注:视频上传是将视频上传到tomcat服务器上面,当服务器处于开着的状态可以进行视频的播放,当服务器

关掉之后视频将清空,如果tomcat设置的是关闭之后,将清空tomcat中的缓存,就会出现在mysql数据库中的存储的视频地址将失效,当然如果上传的视频保存在项目根路径下,那么就不会出现这种情况。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:短信接口api哪个好(短信对接接口)
下一篇:JAVA中StackOverflowError错误的解决
相关文章

 发表评论

暂时没有评论,来抢沙发吧~