这篇文章将为大家详细讲解有关ssm怎么实现视频的上传和播放,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
@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 sctx = 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,"<script>alert('"+message+"');window.location.href='indexing.cphtml';</script>");
}
@RequestMapping("play")
public String play(int id, HttpServletRequest request, HttpServletResponse response) 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和controller中的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<String> roles = new HashSet<String>();
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;
}
关于“ssm怎么实现视频的上传和播放”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。