【SSM】上传视频与播放

	<h2>视频上传</h2>
	<form method="post" action="uploadVideo" enctype="multipart/form-data">    
    <div class="form-group" align="center">
                文件上传:<input type="file" class="form-control" name="file"id="file">        
        上传地址:<select name="shipin">
        <option value="/video/">视频文件</option>
    </select>
        <input type="submit" value="上传">        
    </div>
</form>
public class FileEntity {
	
    private long fileId;
    
    /*****
     * 原文件名
     ***/
    
    private String titleOrig;
 
    /*****
     * 修改后文件名
     ***/
    
    private String titleAlter;
 
    /*****
     * 文件大小
     ***/
    
    private String size;
 
    /*****
     * 文件类型
     ***/
    
    private String type;
 
    /*****
     * 文件保存路径
     ***/
    
    private String path;
 
    /*****
     * 文件上传时间
     ***/
    
    private Timestamp uploadTime;

	@Autowired
	private FileService service;

	@RequestMapping(value = "/uploadVideo")
	@ResponseBody
	public ModelAndView upload(@RequestParam(value = "file", required = false) MultipartFile multipartFile,
			HttpServletRequest request, ModelMap map) {
		String message = "";
		FileEntity entity = new FileEntity();
		String logoPathDir = request.getParameter("shipin");
		System.out.println("-------" + logoPathDir + "----------------------------------");//在E:\1code\jsp-springMVC\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\ssm-crud\video内
		FileUploadTool fileUploadTool = new FileUploadTool();
		try {
			entity = fileUploadTool.createFile(logoPathDir, multipartFile, request);
			if (entity != null) {
				service.saveFile(entity);
				System.out.println("上传成功");
				message = "上传成功";
				map.put("entity", entity);
				map.put("result", message);
			} else {
				System.out.println("上传失败");
				message = "上传失败";
				map.put("result", message);
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		return new ModelAndView("file/successVideo", map);
	}

	@RequestMapping(value = "/{id}/play")
	@ResponseBody
	public ModelAndView playVideo(@PathVariable("id") long id, ModelMap model) {

		// CharterDto charterDto_ = charterFacade.getCharterById(id);
		FileEntity entity = service.findByid(id);
		model.put("entity", entity.getPath());
		ModelAndView view = new ModelAndView("file/successVideo", model);
		return view;
	}
DAO
public interface FileMapper {
	void saveFile(FileEntity entity);
	FileEntity findByid(long id);
	List<FileEntity> findAll();
}
Service
@Service
public class FileService{
	@Autowired
	private FileMapper fileMapper;
	
	public void saveFile(FileEntity entity) {
		fileMapper.saveFile(entity);
	}
	
	public FileEntity findByid(long id) {
		return fileMapper.findByid(id);
		
	}

}
工具类
package com.atguigu.crud.utils;

import org.springframework.web.multipart.MultipartFile;

import com.atguigu.crud.bean.FileEntity;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Random;

//文件上传工具
public class FileUploadTool {
// 转码工具类
	TransfMediaTool transfMediaTool = new TransfMediaTool();
// 文件最大500M
	private static long upload_maxsize = 5000 * 1024 * 1024;
// 文件允许格式
	private static String[] allowFiles = { ".rar", ".doc", ".docx", ".zip", ".pdf", ".txt", ".swf", ".xlsx", ".gif",
			".png", ".jpg", ".jpeg", ".bmp", ".xls", ".mp4", ".flv", ".ppt", ".avi", ".mpg", ".wmv", ".3gp", ".mov",
			".asf", ".asx", ".vob", ".wmv9", ".rm", ".rmvb", ".mkv" };
// 允许转码的视频格式(ffmpeg)
	private static String[] allowFLV = { ".avi", ".mpg", ".wmv", ".3gp", ".mov", ".asf", ".asx", ".vob" };
// 允许的视频转码格式(mencoder)
	private static String[] allowAVI = { ".wmv9", ".rm", ".rmvb" };

	public FileEntity createFile(String logoPathDir, MultipartFile multipartFile, HttpServletRequest request) {
		FileEntity entity = new FileEntity();
		boolean bflag = false;
		String fileName = multipartFile.getOriginalFilename().toString();
		// 判断文件不为空
		if (multipartFile.getSize() != 0 && !multipartFile.isEmpty()) {
			bflag = true;
			// 判断文件大小
			if (multipartFile.getSize() <= upload_maxsize) {
				bflag = true;
				// 文件类型判断
				if (this.checkFileType(fileName)) {
					bflag = true;
				} else {
					bflag = false;
					System.out.println("文件类型不允许");
				}
			} else {
				bflag = false;
				System.out.println("文件大小超范围");
			}
		} else {
			bflag = false;
			System.out.println("文件为空");
		}
		if (bflag) {
			//上传到项目的根路径下的前台要求的指定文件夹下
			String logoRealPathDir = request.getSession().getServletContext().getRealPath(logoPathDir);
			//上传到本地磁盘
			// String logoRealPathDir = "E:/upload";
			File logoSaveFile = new File(logoRealPathDir);
			if (!logoSaveFile.exists()) {
				logoSaveFile.mkdirs();
			}
			//文件名
			String name = fileName.substring(0, fileName.lastIndexOf("."));
			// 新的文件名
			String newFileName = this.getName(name);
			// 文件扩展名
			String fileEnd = this.getFileExt(fileName);
			// 绝对路径
			String fileNamedirs = logoRealPathDir + File.separator + newFileName + fileEnd;
			File filedirs = new File(fileNamedirs);
			// 转入文件
			try {
				multipartFile.transferTo(filedirs);
			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			// 相对路径
			entity.setType(fileEnd);
			String fileDir = logoPathDir + newFileName + fileEnd;
			StringBuilder builder = new StringBuilder(fileDir);
			String finalFileDir = builder.substring(1);
			// size存储为String
			String size = this.getSize(filedirs);
			// 源文件保存路径
			String aviPath = filedirs.getAbsolutePath();

			// 转码Avi
            // //boolean flag = false;
/*			if (this.checkAVIType(fileEnd)) {
				// 设置转换为AVI格式后文件的保存路径
				String codcAviPath = logoRealPathDir + File.separator + newFileName + ".avi";
				// 获取配置的转换工具(mencoder.exe :http://www1.mplayerhq.hu/design7/dload.html)的存放路径
				String mencoderPath = request.getSession().getServletContext().getRealPath("/tools/mencoder.exe");
				aviPath = transfMediaTool.processAVI(mencoderPath, filedirs.getAbsolutePath(), codcAviPath);
				fileEnd = this.getFileExt(codcAviPath);
			}*/

			if (aviPath != null) {

				// 转码Flv
/*				if (this.checkMediaType(fileEnd)) {
					try {
						// 设置转换为flv格式后文件的保存路径
						String codcFilePath = logoRealPathDir + File.separator + newFileName + ".flv";
						// 获取配置的转换工具(ffmpeg.exe :http://www.ffmpeg.org/download.html)的存放路径
						String ffmpegPath = request.getSession().getServletContext().getRealPath("/tools/ffmpeg.exe");
						transfMediaTool.processFLV(ffmpegPath, aviPath,    codcFilePath);
						fileDir = logoPathDir + newFileName + ".flv";
						builder = new StringBuilder(fileDir);
						finalFileDir = builder.substring(1);
					} catch (Exception e) {
						e.printStackTrace();
					}
				}*/

				entity.setSize(size);
				entity.setPath(finalFileDir);// 相对路径:finalFileDir 绝对路径:fileNamedirs
				entity.setTitleOrig(name);
				entity.setTitleAlter(newFileName);
				Timestamp timestamp = new Timestamp(System.currentTimeMillis());
				entity.setUploadTime(timestamp);
				return entity;
			}
		} else {
			return null;
		}
		return entity;

	}

	/**
	 * 文件类型判断
	 *
	 * @param fileName
	 * @return
	 */
	private boolean checkFileType(String fileName) {
		Iterator<String> type = Arrays.asList(allowFiles).iterator();
		while (type.hasNext()) {
			String ext = type.next();
			if (fileName.toLowerCase().endsWith(ext)) {
				return true;
			}
		}

		return false;
	}

	/**
	 * 视频类型判断(flv)
	 *
	 * @param fileEnd
	 * @return
	 */
	private boolean checkMediaType(String fileEnd) {
		Iterator<String> type = Arrays.asList(allowFLV).iterator();
		while (type.hasNext()) {
			String ext = type.next();
			if (fileEnd.equals(ext)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 视频类型判断(AVI)
	 *
	 * @param fileEnd
	 * @return
	 */
	private boolean checkAVIType(String fileEnd) {
		Iterator<String> type = Arrays.asList(allowAVI).iterator();
		while (type.hasNext()) {
			String ext = type.next();
			if (fileEnd.equals(ext)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 获取文件扩展名
	 *
	 * @return string
	 */
	private String getFileExt(String fileName) {
		return fileName.substring(fileName.lastIndexOf("."));
	}

	/**
	 * 依据原始文件名生成新文件名 UUID:全局唯一标识符,由一个十六位的数字组成,由三部分组成:当前日期和时间、时钟序列、全局唯一的IEEE机器识别号
	 * 
	 * @return string
	 */
	private String getName(String fileName) {
		Random random = new Random();
		return "" + random.nextInt(10000) + System.currentTimeMillis();
        //return UUID.randomUUID().toString() + "_" + fileName;

	}

	/**
	 * 文件大小,返回kb.mb ?
	 * 
	 * @return
	 */
	private String getSize(File file) {
		String size = "";
		long fileLength = file.length();
		DecimalFormat df = new DecimalFormat("#.00");
		if (fileLength < 1024) {
			size = df.format((double) fileLength) + "BT";
		} else if (fileLength < 1048576) {
			size = df.format((double) fileLength / 1024) + "KB";
		} else if (fileLength < 1073741824) {
			size = df.format((double) fileLength / 1048576) + "MB";
		} else {
			size = df.format((double) fileLength / 1073741824) + "GB";
		}

		return size;

	}

}

视频转码
package com.atguigu.crud.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class TransfMediaTool {

    /**
     * 视频转码flv
     *
     * @param ffmpegPath
     *            转码工具的存放路径
     * @param upFilePath
     *            用于指定要转换格式的文件,要截图的视频源文件
     * @param codcFilePath
     *            格式转换后的的文件保存路径
     * @return
     * @throws Exception
     */
    public void processFLV(String ffmpegPath, String upFilePath, String codcFilePath) {
        // 创建一个List集合来保存转换视频文件为flv格式的命令
        List<String> convert = new ArrayList<String>();
        convert.add(ffmpegPath); // 添加转换工具路径
        convert.add("-i"); // 添加参数"-i",该参数指定要转换的文件
        convert.add(upFilePath); // 添加要转换格式的视频文件的路径
        convert.add("-ab");
        convert.add("56");
        convert.add("-ar");
        convert.add("22050");
        convert.add("-q:a");
        convert.add("8");
        convert.add("-r");
        convert.add("15");
        convert.add("-s");
        convert.add("600*500");

        /*
         * convert.add("-qscale"); // 指定转换的质量 convert.add("6");
         * convert.add("-ab"); // 设置音频码率 convert.add("64"); convert.add("-ac");
         * // 设置声道数 convert.add("2"); convert.add("-ar"); // 设置声音的采样频率
         * convert.add("22050"); convert.add("-r"); // 设置帧频 convert.add("24");
         * convert.add("-y"); // 添加参数"-y",该参数指定将覆盖已存在的文件
         */
        convert.add(codcFilePath);
        try {
            Process videoProcess = new ProcessBuilder(convert).redirectErrorStream(true).start();
            new PrintStream(videoProcess.getInputStream()).start();
            videoProcess.waitFor();
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), 先用mencoder转换为avi(ffmpeg能解析的)格式
     *
     * @param mencoderPath
     *            转码工具的存放路径
     * @param upFilePath
     *            用于指定要转换格式的文件,要截图的视频源文件
     * @param codcAviPath
     *            格式转换后的的文件保存路径
     * @return
     * @throws Exception
     */
    public String processAVI(String mencoderPath, String upFilePath, String codcAviPath) {
//        boolean flag = false;
        List<String> commend = new ArrayList<String>();
        commend.add(mencoderPath);
        commend.add(upFilePath);
        commend.add("-oac");
        commend.add("mp3lame");
        commend.add("-lameopts");
        commend.add("preset=64");
        commend.add("-lavcopts");
        commend.add("acodec=mp3:abitrate=64");
        commend.add("-ovc");
        commend.add("xvid");
        commend.add("-xvidencopts");
        commend.add("bitrate=600");
        commend.add("-of");
        commend.add("avi");
        commend.add("-o");
        commend.add(codcAviPath);
        try {
            // 预处理进程
            ProcessBuilder builder = new ProcessBuilder();
            builder.command(commend);
            builder.redirectErrorStream(true);

            // 进程信息输出到控制台
            Process p = builder.start();
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line = null;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
            p.waitFor();// 直到上面的命令执行完,才向下执行
            return codcAviPath;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

}

class PrintStream extends Thread {
    java.io.InputStream __is = null;

    public PrintStream(java.io.InputStream is) {
        __is = is;
    }

    public void run() {
        try {
            while (this != null) {
                int _ch = __is.read();
                if (_ch != -1)
                    System.out.print((char) _ch);
                else
                    break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.FileMapper">
  <select id="findByid" parameterType="java.lang.Long">
  
  select * from videoup where fileId=#{id}
  </select>
  
  <insert id="saveFile" parameterType="com.bean.FileEntity">
  titleOrig,
  titleAlter,
  size,
  type,
  path,
  uploadTime
)
VALUES
  (#{titleOrig}, #{titleAlter}, #{size}, #{type}, #{path},#{uploadTime})
  
  </insert>
</mapper>

在这里插入图片描述
在这里插入图片描述
转载来源 https://blog.csdn.net/weixin_40778442/article/details/80176074

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、项目简介 本项目是一套基于SSM视频播放网站,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本、软件工具、项目说明等,该项目可以直接作为毕设使用。 项目都经过严格调试,确保可以运行! 二、技术实现 ​后台框架:Spring、SpringMVC、MyBatis ​数据库:MySQL 开发环境:JDK、Eclipse、Tomcat 三、系统功能 该视频播放网站共包含两种角色:用户、管理员,主要分为前台和后台两大模块。 本系统主要包含了系统用户管理、站内新闻管理、收藏信息管理、收藏信息管理多个功能模块。下面分别简单阐述一下这几个功能模块需求。 1.管理员的登录模块:管理员登录系统对本系统其他管理模块进行管理。 2.用户的登录模块:用户登录本系统,对个人的信息等进行查询,操作可使用的功能。 3.用户注册模块:游客用户可以进行用户注册,系统会反馈是否注册成功。 4.添加管理员模块:向本系统中添加更多的管理人员,管理员包括普通管理员和超级管理员。 5.站内新闻管理模块: 站内新闻列表:将数据库的站内新闻表以列表的形式呈现给管理员。 添加站内新闻:实现管理员添加站内新闻。 修改站内新闻:实现管理员修改站内新闻。 6.视频类别管理模块: 视频类别列表:将数据库的视频类别表以列表的形式呈现给管理员。 添加视频类别:实现管理员添加视频类别。 修改视频类别:实现管理员修改视频类别。 7.收藏信息管理模块: 收藏信息列表:显示系统的所有收藏信息,可以通过关键字查询。 收藏信息删除:对输入错误或过期的收藏信息删除。 视频信息管理模块: 视频信息列表:显示系统的所有视频信息,可以通过关键字查询。 视频信息删除:对输入错误或过期的视频信息删除。 8.用户模块: 资料管理:用户登录本系统。可以对自己的个人主页进行查看。 系统信息:用户可以查看自己的系统提示信息。 修改资料:用户可以修改自己的账号密码。 信息搜索:用户可以通过关键字搜索站内信息。 密码修改:用户可以修改个人登录密码。 9.系统管理模块:包括数据备份。 10.退出模块: 管理员退出:管理员用来退出系统。 用户退出:用户用来退出系统。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值