控制层类:

  1. package com.grab.video.controller;
  2.  
  3. import java.io.BufferedOutputStream;
  4. import java.io.BufferedReader;
  5. import java.io.File;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.InputStreamReader;
  9. import java.io.UnsupportedEncodingException;
  10. import java.io.Writer;
  11. import java.net.HttpURLConnection;
  12. import java.net.MalformedURLException;
  13. import java.net.URL;
  14. import java.net.URLDecoder;
  15. import java.net.URLEncoder;
  16. import java.nio.charset.Charset;
  17. import java.sql.SQLException;
  18. import java.sql.Timestamp;
  19. import java.util.ArrayList;
  20. import java.util.Date;
  21. import java.util.List;
  22. import java.util.Scanner;
  23. import java.util.concurrent.ExecutorService;
  24. import java.util.concurrent.Executors;
  25.  
  26. import javax.servlet.ServletContext;
  27. import javax.servlet.ServletOutputStream;
  28. import javax.servlet.http.HttpServletRequest;
  29. import javax.servlet.http.HttpServletResponse;
  30. import javax.servlet.http.HttpSession;
  31.  
  32. import org.apache.commons.io.FilenameUtils;
  33. import org.apache.commons.lang3.StringUtils;
  34. import org.apache.http.HttpEntity;
  35. import org.apache.http.client.ClientProtocolException;
  36. import org.apache.http.client.methods.CloseableHttpResponse;
  37. import org.apache.http.client.methods.HttpGet;
  38. import org.apache.http.impl.client.CloseableHttpClient;
  39. import org.apache.http.impl.client.HttpClients;
  40. import org.slf4j.Logger;
  41. import org.slf4j.LoggerFactory;
  42. import org.springframework.beans.factory.annotation.Autowired;
  43. import org.springframework.http.HttpHeaders;
  44. import org.springframework.http.HttpStatus;
  45. import org.springframework.http.MediaType;
  46. import org.springframework.http.ResponseEntity;
  47. import org.springframework.stereotype.Controller;
  48. import org.springframework.web.bind.ServletRequestUtils;
  49. import org.springframework.web.bind.annotation.RequestMapping;
  50. import org.springframework.web.bind.annotation.RequestMethod;
  51. import org.springframework.web.bind.annotation.ResponseBody;
  52. import org.springframework.web.servlet.ModelAndView;
  53. import org.springframework.web.servlet.view.RedirectView;
  54.  
  55. import com.fasterxml.jackson.core.JsonGenerationException;
  56. import com.fasterxml.jackson.databind.JsonMappingException;
  57. import com.fasterxml.jackson.databind.ObjectMapper;
  58.  
  59. @Controller
  60. public class GrabVideoController {
  61.  
  62. private static final Logger LOG = LoggerFactory.getLogger(GrabVideoController.class);
  63.  
  64. //private static String filePath="D:\\logs\\video";
  65. private static String filePath = "/home/grabVideo/";
  66.  
  67. @Autowired
  68. ServletContext context;
  69.  
  70. /**
  71. * 输入userid能够使用
  72. *
  73. * @param request
  74. * @param response
  75. * @return
  76. */
  77. @RequestMapping(value = "/grab/login", method = { RequestMethod.GET })
  78. public ModelAndView login(HttpServletRequest request, HttpServletResponse response) {
  79. String userId = ServletRequestUtils.getStringParameter(request, "userId", "");
  80. String ts = ServletRequestUtils.getStringParameter(request, "ts", "");
  81. String sign = ServletRequestUtils.getStringParameter(request, "sign", "");
  82.  
  83. ModelAndView mav = new ModelAndView();
  84. // 身份验证
  85. if (StringUtils.isNotBlank(userId)) {
  86. String encryptedSign = EncryptionUtils.md5Hex(ts + userId + "grab");
  87. if (sign.equals(encryptedSign)) {
  88. HttpSession session = request.getSession();
  89. session.setMaxInactiveInterval(5*24*60*60);//秒为单位,设置session周期为5天
  90. session.setAttribute("userId", userId);// 把userId存放到session
  91. String url = "/grab/import";
  92. mav.setView(new RedirectView(url));
  93. return mav;
  94. }
  95. }
  96.  
  97. mav.setViewName("video/error");
  98. return mav;
  99. }
  100.  
  101. /**
  102. * 导入文件
  103. *
  104. * @return
  105. */
  106. @RequestMapping(value = "/grab/import", method = { RequestMethod.GET })
  107. public ModelAndView importFile(HttpServletRequest request, HttpServletResponse response) {
  108. // String userId = ServletRequestUtils.getStringParameter(request,
  109. // "userId", null);
  110. ModelAndView mav = new ModelAndView();
  111. HttpSession session = request.getSession();
  112.  
  113. String userId = null;
  114. if (session.getAttribute("userId") != null) {
  115. userId = (String) session.getAttribute("userId");
  116. SqlFileList sqlFileList = new SqlFileList();
  117. List<FileListModel> list = new ArrayList<FileListModel>();
  118. try {
  119. list = sqlFileList.selectDate(userId);
  120. } catch (SQLException e) {
  121. // TODO Auto-generated catch block
  122. e.printStackTrace();
  123. }
  124.  
  125. // 从POLYV的API获取文件夹
  126.  
  127. mav.addObject("list", list);
  128. mav.addObject("userId", userId);
  129. mav.setViewName("video/import");
  130. return mav;
  131. }
  132.  
  133. mav.setViewName("video/login");
  134. return mav;
  135.  
  136. }
  137.  
  138. /**
  139. * 删除文件
  140. *
  141. * @param request
  142. * @param response
  143. * @return
  144. */
  145. @RequestMapping(value = "/grab/delete/file", method = { RequestMethod.GET })
  146. public ResponseEntity<AjaxPostResponse> deleteFile(HttpServletRequest request,
  147. HttpServletResponse response) {
  148. String fileId = ServletRequestUtils.getStringParameter(request, "fileId", null);
  149.  
  150. MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
  151. HttpHeaders headers = new HttpHeaders();
  152. headers.setContentType(mediaType);
  153.  
  154. SqlFileList sqlFileList = new SqlFileList();
  155. try {
  156. sqlFileList.deleteDate(fileId);
  157. } catch (SQLException e) {
  158. // TODO Auto-generated catch block
  159. e.printStackTrace();
  160. }
  161.  
  162. AjaxPostResponse resp = new AjaxPostResponse("yes");
  163. return new ResponseEntity<AjaxPostResponse>(resp, headers, HttpStatus.OK);
  164. }
  165.  
  166. /**
  167. * 解析文件
  168. *
  169. * @return
  170. * @throws UnsupportedEncodingException
  171. */
  172. @RequestMapping(value = "/grab/analysis", method = { RequestMethod.GET })
  173. public ResponseEntity<AjaxPostResponse> analysisFile(HttpServletRequest request,
  174. HttpServletResponse response) throws UnsupportedEncodingException {
  175. Integer fileId = ServletRequestUtils.getIntParameter(request, "fileId", 0);
  176. String fileUrl = ServletRequestUtils.getStringParameter(request, "fileUrl", "");
  177. String classifyId = ServletRequestUtils.getStringParameter(request, "classifyId",
  178. "classifyId");
  179. String classifyName = ServletRequestUtils.getStringParameter(request, "classifyName", "");
  180. String userId = ServletRequestUtils.getStringParameter(request, "userId", null);
  181.  
  182. MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
  183. HttpHeaders headers = new HttpHeaders();
  184. headers.setContentType(mediaType);
  185.  
  186. String errorStr="";
  187. System.out.println("==========="+userId);
  188. List<String> urlList = new ArrayList<String>();
  189. List<String> titleList = new ArrayList<String>();
  190. try {
  191. System.out.println("file============"+fileUrl);
  192.  
  193. CloseableHttpClient httpclient = HttpClients.createDefault();
  194. HttpGet httpGet = new HttpGet(fileUrl);
  195. try {
  196. CloseableHttpResponse response2 = httpclient.execute(httpGet);
  197. InputStream is = null;
  198. Scanner sc = null;
  199. Writer os = null;
  200. if (response2.getStatusLine().getStatusCode() == org.apache.http.HttpStatus.SC_OK) {
  201. try {
  202. // 2、获取response的entity。
  203.  
  204. HttpEntity entity = response2.getEntity();
  205. is = entity.getContent();
  206. //sc = new Scanner(is);
  207. BufferedReader reader = new BufferedReader(new InputStreamReader(
  208. is, "UTF-8"));
  209. int n=0;
  210. String line = null;
  211. while ((line = reader.readLine()) != null) {
  212. n++;
  213. try {
  214. String str = line;
  215. //
  216. String urlstr = str.substring(0, str.indexOf(","));
  217. String title = str.substring(str.lastIndexOf(",") + 1, str.length());
  218. //
  219. urlList.add(urlstr);
  220. titleList.add(title);
  221. } catch (Exception e) {
  222. // TODO Auto-generated catch block
  223. System.out.println("解析失败"+n);
  224. errorStr=errorStr+","+n;
  225. e.printStackTrace();
  226. }
  227. }
  228. errorStr=errorStr+"行格式原因";
  229. }catch(Exception e){
  230. System.out.println("解析失败");
  231. } finally {
  232. if (sc != null) {
  233. sc.close();
  234. }
  235. if (is != null) {
  236. is.close();
  237. }
  238. if (os != null) {
  239. os.close();
  240. }
  241. if (response2 != null) {
  242. response2.close();
  243. }
  244. }
  245. }
  246. }catch(Exception e){
  247. System.out.println("解析失败");
  248. }
  249.  
  250. } catch (Exception e) {
  251. // TODO Auto-generated catch block
  252. LOG.info("文件解析失败:" + e);
  253. e.printStackTrace();
  254. AjaxPostResponse resp = new AjaxPostResponse(errorStr+":解析失败");
  255. return new ResponseEntity<AjaxPostResponse>(resp, headers, HttpStatus.OK);
  256. }
  257.  
  258. // 更新状态
  259. SqlFileList sqlFileList = new SqlFileList();
  260. FileListModel file = new FileListModel();
  261. file.setFileId(fileId);
  262. file.setStatus("Y");
  263. try {
  264. sqlFileList.updateDate(file);
  265. } catch (SQLException e1) {
  266. // TODO Auto-generated catch block
  267. LOG.info("文件状态改动成功:" + e1);
  268. e1.printStackTrace();
  269. }
  270.  
  271. // LOG.info("00000"+classifyName);
  272. classifyName = classifyName.replace("-", "");
  273. // LOG.info(classifyName);
  274.  
  275. // 加入数据
  276. Date date = new Date();
  277. Timestamp timeStamp = new Timestamp(date.getTime());
  278. GetRandomString randomStr = new GetRandomString();
  279. for (int i = 0; i < urlList.size(); i++) {
  280.  
  281. VideoListModel video = new VideoListModel();
  282. video.setUserId(userId);
  283. video.setUrl(urlList.get(i));// 视频源地址
  284. video.setTitle(titleList.get(i));// 视频标题
  285.  
  286. String urlstr = urlList.get(i);
  287. // String path=urlstr.substring(0, urlstr.indexOf("?"));
  288. // String format=path.substring(path.lastIndexOf("."),
  289. // path.length());//视频格式
  290. // String baseName = FilenameUtils.getBaseName(urlstr);
  291. String extendname = FilenameUtils.getExtension(urlstr);
  292. if(extendname.contains("?")){
  293. extendname=extendname.substring(0,extendname.indexOf("?
  294.  
  295. "));
  296. }
  297.  
  298. if (StringUtils.isBlank(extendname)) {
  299. extendname = "mp4";
  300. }
  301. String trueName = randomStr.generateRandomString(15);
  302. String filename = trueName + "." + extendname;
  303. video.setTrueName(filename);// 用于下载使用的视频名称
  304.  
  305. video.setClassifyId(classifyId);
  306. //video.setClassifyName(classifyName.trim());
  307. video.setClassifyName(URLDecoder.decode(classifyName.trim(),"GBK"));
  308. video.setStatus(VideoStatus.NO.getValue());// 等待、
  309. video.setVid("");
  310. video.setCreateTime(timeStamp);
  311. video.setLastDate(timeStamp);
  312.  
  313. SqlVideoList sqlvideo = new SqlVideoList();
  314. try {
  315. sqlvideo.insertDate(video);// 加入数据库
  316. } catch (SQLException e) {
  317. // TODO Auto-generated catch block
  318. LOG.info("加入数据库:" + e);
  319. e.printStackTrace();
  320. AjaxPostResponse resp = new AjaxPostResponse("no");
  321. return new ResponseEntity<AjaxPostResponse>(resp, headers, HttpStatus.OK);
  322. }
  323. }
  324.  
  325. AjaxPostResponse resp = new AjaxPostResponse("yes");
  326. return new ResponseEntity<AjaxPostResponse>(resp, headers, HttpStatus.OK);
  327. }
  328.  
  329. /**
  330. * 获取下载进度
  331. *
  332. * @return
  333. */
  334. @RequestMapping(value = "/grab/download/progress", method = { RequestMethod.POST,
  335. RequestMethod.GET })
  336. public ResponseEntity<AjaxPostResponse> getProgress(HttpServletRequest request,
  337. HttpServletResponse response) {
  338. Integer id = ServletRequestUtils.getIntParameter(request, "videoId", 0);
  339. String userId = ServletRequestUtils.getStringParameter(request, "userId", "test");
  340. String urlstr = ServletRequestUtils.getStringParameter(request, "url", "");
  341. String trueName = ServletRequestUtils.getStringParameter(request, "trueName", "");
  342.  
  343. MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
  344. HttpHeaders headers = new HttpHeaders();
  345. headers.setContentType(mediaType);
  346.  
  347. // LOG.info("--id---"+id+"---u---"+userId);
  348.  
  349. int content = 1;
  350. int length = 1;
  351. int progress = 1;
  352. HttpSession session = request.getSession();
  353.  
  354. // LOG.info("-------ccccc4------------"+session.getAttribute("fileSize"+id));
  355. if (session.getAttribute("fileSize" + String.valueOf(id)) == null) {
  356. // 文件大小还没存进session中
  357. List<TaskQueue> list = new ArrayList<TaskQueue>();
  358. SqlTaskQueue stq = new SqlTaskQueue();
  359. try {
  360. list = stq.selectDateOne(String.valueOf(id));
  361. } catch (SQLException e2) {
  362. // TODO Auto-generated catch block
  363. LOG.info("查询文件大小" + e2);
  364. e2.printStackTrace();
  365. }
  366.  
  367. if (list.size() > 0) {
  368. TaskQueue tQueue = list.get(0);
  369. content = tQueue.getFileSize();
  370. session.setAttribute("fileSize" + String.valueOf(id), content);// 存进session
  371. } else {
  372. URL url = null;
  373. try {
  374. url = new URL(urlstr);
  375. HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 进行连接握手
  376. connection.setRequestMethod("GET");// 请求方式
  377. content = (int) connection.getContentLength();
  378. session.setAttribute("fileSize" + String.valueOf(id), content);// 存进session
  379. // LOG.info("-------content------"+content);
  380. } catch (Exception e1) {
  381. // TODO Auto-generated catch block
  382. LOG.info("链接失败" + e1);
  383. e1.printStackTrace();
  384. }
  385. }
  386. } else {
  387. // 文件大少在session中
  388. String contentString = String.valueOf(session.getAttribute("fileSize"
  389. + String.valueOf(id)));
  390. // LOG.info("-------ccccc------------"+contentString);
  391. content = Integer.parseInt(contentString.trim());
  392. }
  393.  
  394. // 文件存储位置、文件命名处理
  395. try {
  396. // String path=urlstr.substring(0, urlstr.indexOf("?"));
  397. // String name=path.substring(path.lastIndexOf("/")+1,
  398. // path.length());
  399. // String filename=name.trim();
  400. String filename = trueName;
  401.  
  402. File file = new File(filePath, filename);
  403.  
  404. if (!file.exists()) {
  405. progress = (Integer) session.getAttribute(userId + id);// 将当前下载进度存放到session中。
  406.  
  407. } else {
  408. length = (int) file.length();
  409. progress = length * 100 / content;
  410. // 将当前下载进度存放到session中。
  411. session.setAttribute(userId + id, progress);
  412. LOG.info(id + "-------progress------" + progress);
  413. }
  414.  
  415. } catch (Exception e) {
  416. LOG.info("不能解析的路径:" + e);
  417. AjaxPostResponse resp = new AjaxPostResponse(progress);
  418. return new ResponseEntity<AjaxPostResponse>(resp, headers, HttpStatus.OK);
  419. }
  420.  
  421. AjaxPostResponse resp = new AjaxPostResponse(progress);
  422. return new ResponseEntity<AjaxPostResponse>(resp, headers, HttpStatus.OK);
  423. }
  424.  
  425. /**
  426. * 批量抓取视频(下载视频模块--依据视频源地址去抓取视频)管理
  427. *
  428. * @return
  429. * @throws MalformedURLException
  430. */
  431. @RequestMapping(value = "/grab/download/manage", method = { RequestMethod.POST })
  432. public ModelAndView grabDownloadVideo(HttpServletRequest request, HttpServletResponse response) {
  433. int[] id = ServletRequestUtils.getIntParameters(request, "videoId");
  434. String userId = ServletRequestUtils.getStringParameter(request, "userId", "test");
  435. String[] urlstr = ServletRequestUtils.getStringParameters(request, "url");
  436. String[] trueName = ServletRequestUtils.getStringParameters(request, "trueName");
  437.  
  438. int len = id.length;
  439.  
  440. List<TaskQueue> taskQueues = new ArrayList<TaskQueue>();
  441. for (int i = 0; i < len; i++) {
  442. TaskQueue tq = new TaskQueue();
  443. tq.setTaskId(String.valueOf(id[i]));
  444. tq.setVideoId(id[i]);
  445. tq.setUserId(userId);
  446. tq.setVideoUrl(urlstr[i]);
  447. tq.setTrueName(trueName[i]);
  448. taskQueues.add(tq);
  449. }
  450.  
  451. // 把任务队列加入进数据库
  452. if (taskQueues.size() > 0) {
  453. // 存在有任务
  454. for (int i = 0; i < taskQueues.size(); i++) {
  455. TaskQueue task = taskQueues.get(i);
  456. List<TaskQueue> taskList = new ArrayList<TaskQueue>();// 查询任务是否已存在
  457. try {
  458. SqlTaskQueue stq = new SqlTaskQueue();
  459. taskList = stq.selectDateOne(task.getTaskId());
  460. } catch (SQLException e1) {
  461. // TODO Auto-generated catch block
  462. e1.printStackTrace();
  463. }
  464.  
  465. if (taskList.size() > 0) {
  466. // 该任务已存在
  467. } else {
  468. task.setFileSize(0);
  469. task.setProgress(0);
  470. task.setStatus("N");
  471. Date date = new Date();
  472. Timestamp timeStamp = new Timestamp(date.getTime());
  473. task.setCreateTime(timeStamp);
  474. try {
  475. SqlTaskQueue stq = new SqlTaskQueue();
  476. stq.insertDate(task);
  477. } catch (SQLException e) {
  478. // TODO Auto-generated catch block
  479. LOG.info("下载任务加入失败。" + e);
  480. e.printStackTrace();
  481. }
  482. }
  483. }
  484. }
  485.  
  486. // 获取全部的任务队列
  487. List<TaskQueue> workQueues = new ArrayList<TaskQueue>();
  488. try {
  489. SqlTaskQueue stq = new SqlTaskQueue();
  490. workQueues = stq.selectDate(userId);
  491. } catch (SQLException e) {
  492. // TODO Auto-generated catch block
  493. LOG.info("获取下载任务失败" + e);
  494. e.printStackTrace();
  495. }
  496. // ExecutorService pool = Executors.newFixedThreadPool(3);
  497. if (workQueues.size() > 0) {
  498. for (int i = 0; i < workQueues.size(); i++) {
  499. String taskId = workQueues.get(i).getTaskId();
  500. String urltxt = workQueues.get(i).getVideoUrl();
  501. String filename = workQueues.get(i).getTrueName();
  502.  
  503. File saveFile = new File(filePath, filename);// 文件保存的位置
  504. File fileDir = new File(filePath);
  505. if (!fileDir.exists()) {
  506. fileDir.mkdirs();// 文件夹不存在创建文件夹
  507. }
  508. URL url = null;
  509. try {
  510. url = new URL(workQueues.get(i).getVideoUrl());
  511. } catch (MalformedURLException e) {
  512. // TODO Auto-generated catch block
  513. LOG.info("握手失败" + e);
  514. e.printStackTrace();
  515. }
  516.  
  517. if (url != null) {
  518. // 将下载任务线程。放入线程池中运行
  519. ExecutorService executor = (ExecutorService) context
  520. .getAttribute("DOWNLOAD_EXECUTOR");
  521. executor.submit(new DownloadVideo(url, saveFile, taskId));
  522. // pool.execute(new
  523. // DownloadVideo(url,saveFile,taskId));////////////////////////////////////
  524. VideoListModel vlm = new VideoListModel();
  525. vlm.setId(workQueues.get(i).getVideoId());
  526. vlm.setUserId(userId);
  527. vlm.setStatus(VideoStatus.WAIT.getValue());// 将状态改为等待
  528. try {
  529. SqlVideoList svl = new SqlVideoList();
  530. svl.updateDate(vlm);
  531. } catch (SQLException e) {
  532. // TODO Auto-generated catch block
  533. LOG.info("更改下载状态失败" + e);
  534. e.printStackTrace();
  535. }
  536.  
  537. }
  538. }
  539. }
  540. // 关闭线程池
  541. // pool.shutdown();
  542.  
  543. // 又一次查询视频列表
  544. List<VideoListModel> list = new ArrayList<VideoListModel>();
  545. try {
  546. SqlVideoList svl = new SqlVideoList();
  547. list = svl.selectDate(userId);
  548. } catch (SQLException e) {
  549. // TODO Auto-generated catch block
  550. e.printStackTrace();
  551. }
  552. ModelAndView mav = new ModelAndView();
  553. mav.addObject("videolist", list);
  554. mav.addObject("userId", userId);
  555. mav.setViewName("video/download");
  556. return mav;
  557.  
  558. }
  559.  
  560. /**
  561. * 获取视频的下载进度()
  562. * @param request
  563. */
  564. @RequestMapping(value="/grab/download/status",method = {RequestMethod.GET,RequestMethod.POST})
  565. public @ResponseBody
  566. ResponseEntity<String> downloadStatus(HttpServletRequest request, HttpServletResponse response)
  567. throws JsonGenerationException, JsonMappingException, IOException {
  568.  
  569. HttpSession session = request.getSession();
  570. if (session.getAttribute("userId") != null) {
  571. String userId = (String) session.getAttribute("userId");
  572. List<VideoListModel> list = new ArrayList<VideoListModel>();
  573. try {
  574. SqlVideoList sqlVideoList = new SqlVideoList();
  575. list = sqlVideoList.selectAllDate(userId);
  576. //list = sqlVideoList.selectExecuteDate(userId);
  577. for (int i = 0; i < list.size(); i++) {
  578. VideoListModel model = list.get(i);
  579.  
  580. String filename = model.getTrueName();
  581. File file = new File(filePath, filename);
  582.  
  583. if (file.exists()) {
  584.  
  585. int downloaded = (int) file.length();
  586. if (model.getFileSize() != 0) {
  587. //System.out.println(model.getId()+"===n==="+model.getTrueName()+"===d==="+downloaded+"===s==="+model.getFileSize()+"===="+(long)downloaded * 100 /(long) model.getFileSize());
  588. model.setPercent((int) ((long)downloaded * 100 /(long) model.getFileSize()));
  589. }
  590.  
  591. }
  592.  
  593. }
  594. ObjectMapper objectMapper = new ObjectMapper();
  595. String result = objectMapper.writeValueAsString(list);
  596.  
  597. MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
  598. HttpHeaders headers = new HttpHeaders();
  599. headers.setContentType(mediaType);
  600. return new ResponseEntity<String>(result, headers, HttpStatus.OK);
  601.  
  602. } catch (SQLException e) {
  603. // TODO Auto-generated catch block
  604. System.out.println("获取下载进度出现异常。");
  605. e.printStackTrace();
  606. }
  607.  
  608. }
  609. return null;
  610.  
  611. }
  612.  
  613. @RequestMapping(value = "/grab/download/manage", method = { RequestMethod.GET })
  614. public ModelAndView grabVideo(HttpServletRequest request, HttpServletResponse response) {
  615. // String userId = ServletRequestUtils.getStringParameter(request,
  616. // "userId", "");
  617. String userId = null;
  618.  
  619. ModelAndView mav = new ModelAndView();
  620.  
  621. HttpSession session = request.getSession();
  622. if (session.getAttribute("userId") != null) {
  623. userId = (String) session.getAttribute("userId");
  624. SqlVideoList sqlVideoList = new SqlVideoList();
  625. List<VideoListModel> list = new ArrayList<VideoListModel>();
  626. try {
  627. list = sqlVideoList.selectDate(userId);
  628. } catch (SQLException e) {
  629. // TODO Auto-generated catch block
  630. e.printStackTrace();
  631. }
  632. mav.addObject("videolist", list);
  633. mav.addObject("userId", userId);
  634. mav.setViewName("video/download");
  635. return mav;
  636. }
  637.  
  638. mav.setViewName("video/login");
  639. return mav;
  640. }
  641.  
  642. /**
  643. * 暂停下载
  644. */
  645. @RequestMapping(value = "/grab/video/stop", method = { RequestMethod.GET })
  646. public ResponseEntity<AjaxPostResponse> downloadStop(HttpServletRequest request,
  647. HttpServletResponse response) {
  648. int id = ServletRequestUtils.getIntParameter(request, "videoId",0);
  649. String userId = ServletRequestUtils.getStringParameter(request, "userId", "test");
  650. //String urlstr = ServletRequestUtils.getStringParameter(request, "url","");
  651. //String trueName = ServletRequestUtils.getStringParameter(request, "trueName","");
  652.  
  653. MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
  654. HttpHeaders headers = new HttpHeaders();
  655. headers.setContentType(mediaType);
  656.  
  657. try {
  658. SqlTaskQueue stq = new SqlTaskQueue();
  659. stq.deleteDate(String.valueOf(id));
  660. } catch (SQLException e) {
  661. // TODO Auto-generated catch block
  662. e.printStackTrace();
  663. }
  664.  
  665. // 获取全部的任务队列
  666. List<TaskQueue> workQueues = new ArrayList<TaskQueue>();
  667. try {
  668. SqlTaskQueue stq = new SqlTaskQueue();
  669. workQueues = stq.selectDate(userId);
  670. } catch (SQLException e) {
  671. // TODO Auto-generated catch block
  672. LOG.info("获取下载任务失败" + e);
  673. e.printStackTrace();
  674. }
  675. // ExecutorService pool = Executors.newFixedThreadPool(3);
  676. if (workQueues.size() > 0) {
  677. for (int i = 0; i < workQueues.size(); i++) {
  678. String taskId = workQueues.get(i).getTaskId();
  679. String urltxt = workQueues.get(i).getVideoUrl();
  680. String filename = workQueues.get(i).getTrueName();
  681.  
  682. File saveFile = new File(filePath, filename);// 文件保存的位置
  683. File fileDir = new File(filePath);
  684. if (!fileDir.exists()) {
  685. fileDir.mkdirs();// 文件夹不存在创建文件夹
  686. }
  687. URL url = null;
  688. try {
  689. url = new URL(workQueues.get(i).getVideoUrl());
  690. } catch (MalformedURLException e) {
  691. // TODO Auto-generated catch block
  692. LOG.info("握手失败" + e);
  693. e.printStackTrace();
  694. }
  695.  
  696. if (url != null) {
  697. // 将下载任务线程,放入线程池中运行
  698. ExecutorService executor = (ExecutorService) context
  699. .getAttribute("DOWNLOAD_EXECUTOR");
  700. executor.submit(new DownloadVideo(url, saveFile, taskId));
  701. // pool.execute(new
  702. // DownloadVideo(url,saveFile,taskId));////////////////////////////////////
  703. VideoListModel vlm = new VideoListModel();
  704. vlm.setId(workQueues.get(i).getVideoId());
  705. vlm.setUserId(userId);
  706. vlm.setStatus(VideoStatus.WAIT.getValue());// 将状态改为等待
  707. try {
  708. SqlVideoList svl = new SqlVideoList();
  709. svl.updateDate(vlm);
  710. } catch (SQLException e) {
  711. // TODO Auto-generated catch block
  712. LOG.info("更改下载状态失败" + e);
  713. e.printStackTrace();
  714. }
  715.  
  716. }
  717. }
  718. }
  719.  
  720. System.out.println("停止下载!
  721.  
  722. ");
  723. AjaxPostResponse resp = new AjaxPostResponse("yes");
  724. return new ResponseEntity<AjaxPostResponse>(resp, headers, HttpStatus.OK);
  725. }
  726.  
  727. /**
  728. * 导出下载成功的视频
  729. *
  730. * @return
  731. */
  732. @RequestMapping(value = "/grab/export", method = { RequestMethod.GET })
  733. public ModelAndView exportVideo(HttpServletRequest request, HttpServletResponse response) {
  734. // String userId = ServletRequestUtils.getStringParameter(request,
  735. // "userId", "");
  736. String userId = null;
  737. ModelAndView mav = new ModelAndView();
  738.  
  739. HttpSession session = request.getSession();
  740. if (session.getAttribute("userId") != null) {
  741. userId = (String) session.getAttribute("userId");
  742. SqlVideoList sqlVideoList = new SqlVideoList();
  743. List<VideoListModel> list = new ArrayList<VideoListModel>();
  744. try {
  745. list = sqlVideoList.selectSuccessDate(userId);
  746. } catch (SQLException e) {
  747. // TODO Auto-generated catch block
  748. e.printStackTrace();
  749. }
  750. mav.addObject("videolist", list);
  751. mav.addObject("userId", userId);
  752. mav.setViewName("video/export");
  753. return mav;
  754. }
  755.  
  756. mav.setViewName("video/login");
  757. return mav;
  758. }
  759.  
  760. /**
  761. * export导出文件
  762. */
  763. @RequestMapping(value = "/grab/export/csv", method = { RequestMethod.GET })
  764. public void exportCsv(HttpServletRequest request, HttpServletResponse response) {
  765. String userId = ServletRequestUtils.getStringParameter(request, "userId", "");
  766.  
  767. if (StringUtils.isNotBlank(userId)) {
  768.  
  769. SqlVideoList sqlVideoList = new SqlVideoList();
  770. List<VideoListModel> list = new ArrayList<VideoListModel>();
  771. try {
  772. list = sqlVideoList.selectSuccessDate(userId);
  773. } catch (SQLException e) {
  774. // TODO Auto-generated catch block
  775. e.printStackTrace();
  776. }
  777.  
  778. // 导出txt文件
  779. //response.setContentType("text/plain");
  780. response.setContentType("text/csv; charset=UTF-8");
  781. String fileName = "videolist";
  782. try {
  783. fileName = URLEncoder.encode("videolist", "UTF-8");
  784. } catch (UnsupportedEncodingException e1) {
  785. // TODO Auto-generated catch block
  786. e1.printStackTrace();
  787. }
  788. response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".csv");
  789. BufferedOutputStream buff = null;
  790. StringBuffer write = new StringBuffer();
  791. String enter = "\r\n";
  792. ServletOutputStream outSTr = null;
  793. try {
  794. outSTr = response.getOutputStream(); // 建立
  795. buff = new BufferedOutputStream(outSTr);
  796. // 把内容写入文件
  797. if (list.size() > 0) {
  798. for (int i = 0; i < list.size(); i++) {
  799. write.append(list.get(i).getUrl());
  800. write.append(",");
  801. write.append(list.get(i).getTitle());
  802. write.append(",");
  803. write.append(list.get(i).getVid());
  804. write.append(",");
  805. write.append(list.get(i).getLastDate());
  806. write.append(enter);
  807. }
  808. }
  809. buff.write(write.toString().getBytes("GBK"));
  810. buff.flush();
  811. buff.close();
  812. } catch (Exception e) {
  813. e.printStackTrace();
  814. } finally {
  815. try {
  816. buff.close();
  817. outSTr.close();
  818. } catch (Exception e) {
  819. e.printStackTrace();
  820. }
  821. }
  822. }
  823.  
  824. }
  825.  
  826. /**
  827. * 清空导出视频列表
  828. * /grab/export/clean
  829. */
  830. @RequestMapping(value = "/grab/export/clean", method = { RequestMethod.GET })
  831. public ResponseEntity<AjaxPostResponse> cleanVideo(HttpServletRequest request,
  832. HttpServletResponse response) {
  833.  
  834. MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
  835. HttpHeaders headers = new HttpHeaders();
  836. headers.setContentType(mediaType);
  837.  
  838. HttpSession session = request.getSession();
  839. if (session.getAttribute("userId") != null) {
  840. String userId=(String) session.getAttribute("userId");
  841. SqlVideoList sqlVideoList=new SqlVideoList();
  842. try {
  843. sqlVideoList.cleanDate(userId);
  844. } catch (SQLException e) {
  845. // TODO Auto-generated catch block
  846. e.printStackTrace();
  847. }
  848.  
  849. //删除成功
  850. System.out.println("删除成功!
  851.  
  852. ");
  853. AjaxPostResponse resp = new AjaxPostResponse("yes");
  854. return new ResponseEntity<AjaxPostResponse>(resp, headers, HttpStatus.OK);
  855. }else{
  856. //删除失败
  857. System.out.println("删除失败!");
  858. AjaxPostResponse resp = new AjaxPostResponse("no");
  859. return new ResponseEntity<AjaxPostResponse>(resp, headers, HttpStatus.OK);
  860. }
  861.  
  862. }
  863.  
  864. /**
  865. * 删除视频
  866. * /grab/export/clean
  867. */
  868. @RequestMapping(value = "/grab/delete/videoId", method = { RequestMethod.GET })
  869. public ResponseEntity<AjaxPostResponse> deleteVideo(HttpServletRequest request,
  870. HttpServletResponse response) {
  871. String videoId = ServletRequestUtils.getStringParameter(request, "videoId", null);
  872.  
  873. MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
  874. HttpHeaders headers = new HttpHeaders();
  875. headers.setContentType(mediaType);
  876.  
  877. if (StringUtils.isNotBlank(videoId)) {
  878. SqlVideoList sqlVideoList=new SqlVideoList();
  879. try {
  880. SqlTaskQueue stqSe=new SqlTaskQueue();
  881. List<TaskQueue> list=stqSe.selectDateOne(videoId);
  882. if(list.size()>0){
  883. SqlTaskQueue stq=new SqlTaskQueue();
  884. stq.deleteDate(videoId);//删除任务
  885. }
  886. sqlVideoList.deleteDate(videoId);//删除视频
  887. } catch (SQLException e) {
  888. // TODO Auto-generated catch block
  889. System.out.println("删除失败"+e);
  890. e.printStackTrace();
  891. }
  892.  
  893. //删除成功
  894. AjaxPostResponse resp = new AjaxPostResponse("yes");
  895. return new ResponseEntity<AjaxPostResponse>(resp, headers, HttpStatus.OK);
  896. }else{
  897. //删除失败
  898. AjaxPostResponse resp = new AjaxPostResponse("no");
  899. return new ResponseEntity<AjaxPostResponse>(resp, headers, HttpStatus.OK);
  900. }
  901.  
  902. }
  903.  
  904. /***
  905. * 获取文件内容
  906. * @param url
  907. * @return
  908. */
  909. public String httpGetFile(String url) {
  910. String contentStr="";
  911. CloseableHttpClient httpclient = HttpClients.createDefault();
  912. HttpGet httpGet = new HttpGet(url);
  913. try {
  914. CloseableHttpResponse response = httpclient.execute(httpGet);
  915. InputStream is = null;
  916. Scanner sc = null;
  917. Writer os = null;
  918. if (response.getStatusLine().getStatusCode() == org.apache.http.HttpStatus.SC_OK) {
  919. try {
  920. // 2、获取response的entity。
  921. HttpEntity entity = response.getEntity();
  922. is = entity.getContent();
  923. sc = new Scanner(is);
  924. while (sc.hasNext()) {
  925. contentStr=contentStr+sc.nextLine();
  926. }
  927. } catch (ClientProtocolException e) {
  928. e.printStackTrace();
  929. } finally {
  930. if (sc != null) {
  931. sc.close();
  932. }
  933. if (is != null) {
  934. is.close();
  935. }
  936. if (os != null) {
  937. os.close();
  938. }
  939. if (response != null) {
  940. response.close();
  941. }
  942. }
  943. }
  944.  
  945. } catch (ClientProtocolException e) {
  946. // TODO Auto-generated catch block
  947. e.printStackTrace();
  948. } catch (IOException e) {
  949. // TODO Auto-generated catch block
  950. e.printStackTrace();
  951. }
  952.  
  953. return contentStr;
  954. }
  955.  
  956. }

下载视频主线程类:

package com.grab.video.controller;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; public class DownloadVideo implements Runnable { private static final Logger LOG = LoggerFactory.getLogger(DownloadVideo.class); private static String TAG = "Downloader";
private HttpURLConnection connection;
private URL url;
private File saveFile;
private long fileLength;// 文件总大少
private int progress;// 当前进度
private long downloaded = 0;
private boolean stop=false;
private String taskId;
private static String fileUrl = "http://grab.polyv.net/video/"; private boolean downloadStatus = false; public DownloadVideo(URL url, File saveFile, String taskId) {
this.url = url;
this.saveFile = saveFile;
this.taskId = taskId;
} public DownloadVideo(URL url, File saveFile, String taskId,boolean stop) {
this.url = url;
this.saveFile = saveFile;
this.taskId = taskId;
this.stop = stop;
} public DownloadVideo(String vid, File saveFile) {
// 通过vid,获取视频TODO
} public URL getUrl() {
return url;
} public void setUrl(URL url) {
this.url = url;
} public void setStop(boolean stop) {
this.stop = stop;
} public long getFileLength() {
return fileLength;
} public int getProgress() {
return progress;
} public void setProgress(int progress) {
this.progress = progress;
} public long getDownloaded() {
return downloaded;
} public int getPercent() {
if (fileLength == 0) {
return 0;
}
return (int) (downloaded * 100 / fileLength);
} public void stop() {
stop = true;
} public void start() {
stop = false;
} // 開始运行,实现run方法
public void run() { VideoListModel vlm = new VideoListModel();
vlm.setId(Integer.valueOf(taskId));
vlm.setStatus(VideoStatus.EXECUTE.getValue());// 将状态改为正在运行
try {
SqlVideoList sqlVideoList = new SqlVideoList();
System.out.println("更新下载中状态。。。。");
sqlVideoList.updateDate(vlm);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
BufferedInputStream in = null;
FileOutputStream fos = null;
BufferedOutputStream bout = null;
print("start download:" + url);
connection = (HttpURLConnection) url.openConnection();// 进行连接握手
connection.setRequestProperty("User-Agent", "Polyv"); Map<String, List<String>> map = connection.getRequestProperties();
print(map.toString());// 输出參数
connection.setRequestMethod("GET");// 请求方式
if (saveFile.exists()) {
downloaded = saveFile.length();
connection.setRequestProperty("Range", "bytes=" + downloaded + "-");
} else {
downloaded = 0;// 又一次開始下载
}
// connection.getResponseCode() == 200 206? int code = connection.getResponseCode();// 获取状态码
print("code=" + code + ", downloaded =" + downloaded);
printResponseHeader(connection);
// http200状态,又一次開始下载。206状态续点下载
if (connection.getResponseCode() == 206 || connection.getResponseCode() == 200) {
String range = "";
HashMap<String, String> header = (HashMap<String, String>) getHttpResponseHeader(connection); for (Map.Entry<String, String> entry : header.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"============="+value);
if (key.equals("Content-Range")) {
range = entry.getValue();
}
}
System.out.println("-----range-----"+range);
long content = (long) connection.getContentLength();
fileLength = range.equals("") ? content : Long.valueOf(range.split("/")[1]);
System.out.println("文件===c==="+content+"===f==="+fileLength+"======"+(long)(content+downloaded));
try {
SqlVideoList sqlVideoList = new SqlVideoList();
sqlVideoList.updateFileSize(Integer.valueOf(taskId),content+downloaded);//获取文件的大少(合计才是文件的大少,content是还有多少下载的,downloaded已下载的大少)
} catch (SQLException e2) {
// TODO Auto-generated catch block
System.out.println("获取文件大少失败");
e2.printStackTrace();
} in = new BufferedInputStream(connection.getInputStream());
fos = (downloaded == 0) ? new FileOutputStream(saveFile) : new FileOutputStream(
saveFile, true);
bout = new BufferedOutputStream(fos, 1024);
byte[] data = new byte[1024];
int x = 0;
boolean p = false;
while (!stop && (x = in.read(data, 0, 1024)) >= 0) {
bout.write(data, 0, x);
downloaded += x;
}
bout.close();
System.out.println("下载完毕{}");
downloadStatus = false;// 代表下载成功。不用去更新下载失败的状态 String vid = null;
// 获取vid,(依据taskId即videoId获取视频的title,cataId)
List<VideoListModel> videoList = new ArrayList<VideoListModel>();
try {
SqlVideoList sqlVideoList = new SqlVideoList();
videoList = sqlVideoList.selectDateOne(Integer.valueOf(taskId));
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} if (videoList.size() > 0) {
VideoListModel video = videoList.get(0);
String title = video.getTitle().replace(" ", "");
String cataid = video.getClassifyId();
String userid = video.getUserId();
String trueName = video.getTrueName();
long ts = System.currentTimeMillis();
String sign = EncryptionUtils.md5Hex(ts + userid + "grab");
String url = fileUrl + trueName;
String pathStr="http://v.polyv.net/uc/services/rest?method=uploadForDownloader&fileUrl="+url+"&userid="+userid+"&title="+title+"&cataid="+cataid+"&ts="+ts+"&sign="+sign;
System.out.println("----url-----"+pathStr);
vid=httpGetVid(pathStr);//获取vid
if(vid==null){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
vid=httpGetVid(pathStr);//获取vid
} //第二次
if(vid==null){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
vid=httpGetVid(pathStr);//获取vid
} System.out.println("------下载完毕获取vid---------" + vid);
} // 下载完毕,更改视频状态为SUCCESS
VideoListModel video = new VideoListModel();
video.setId(Integer.valueOf(taskId));
video.setStatus(VideoStatus.SUCCESS.getValue());
video.setVid(vid);
Date date = new Date();
Timestamp timeStamp = new Timestamp(date.getTime());
video.setLastDate(timeStamp);
try {
SqlVideoList sqlVideoList = new SqlVideoList();
sqlVideoList.updateDateVid(video);
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("下载完毕,更改视频状态失败" + e);
e.printStackTrace();
} // 下载完毕,从任务队列移除该任务
try {
SqlTaskQueue stq = new SqlTaskQueue();
stq.deleteDate(taskId);
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("任务移除失败" + e);
e.printStackTrace();
} }else if (connection.getResponseCode() == 416) {
// 416- 请求长度超出范围
System.out.println("已经下载完了======"+connection.getResponseCode());
downloadStatus = false;// 代表下载失败,要去更新下载失败的状态
}else {
downloadStatus = true;// 代表下载失败。要去更新下载失败的状态
} } catch (NumberFormatException e) {
// TODO Auto-generated catch block
downloadStatus = true;// 代表下载失败,要去更新下载失败的状态
e.printStackTrace();
} catch (ProtocolException e) {
// TODO Auto-generated catch block
downloadStatus = true;// 代表下载失败,要去更新下载失败的状态
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
downloadStatus = true;// 代表下载失败。要去更新下载失败的状态
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
downloadStatus = true;// 代表下载失败。要去更新下载失败的状态
e.printStackTrace();
} if (downloadStatus) {
// 下载失败,更改视频状态
VideoListModel video = new VideoListModel();
video.setId(Integer.valueOf(taskId));
video.setStatus(VideoStatus.FAIL.getValue());
try {
SqlVideoList sqlVideoList = new SqlVideoList();
sqlVideoList.updateDate(video);
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("下载失败,更改视频状态失败" + e);
e.printStackTrace();
}
}else{
// 下载完毕。从任务队列移除该任务
try {
SqlTaskQueue stq = new SqlTaskQueue();
stq.deleteDate(taskId);
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("任务移除失败" + e);
e.printStackTrace();
} VideoListModel video = new VideoListModel();
video.setId(Integer.valueOf(taskId));
video.setStatus(VideoStatus.SUCCESS.getValue());
Date date = new Date();
Timestamp timeStamp = new Timestamp(date.getTime());
video.setLastDate(timeStamp);
try {
SqlVideoList sqlVideoList = new SqlVideoList();
sqlVideoList.updateSuccessDate(video);
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("下载好了,更改视频状态失败" + e);
e.printStackTrace();
}
} } /**
* 获取对应头部
*
* @param http
* @return
*/
public static Map<String, String> getHttpResponseHeader(HttpURLConnection http) {
Map<String, String> header = new LinkedHashMap<String, String>();
for (int i = 0;; i++) {
String mine = http.getHeaderField(i);
String key = http.getHeaderFieldKey(i);
System.out.println(key+"=======test======="+mine);
if (key == null || mine == null) {
break;
} else {
header.put(http.getHeaderFieldKey(i), mine);
}
}
return header;
} /**
* 输出信息
*
* @param msg
*/
private static void print(String msg) {
// Log.i(TAG, msg);
System.out.println(TAG + "TAG{}," + msg);
} /**
* 输出对应头信息
*
* @param http
*/
public static void printResponseHeader(HttpURLConnection http) {
Map<String, String> header = getHttpResponseHeader(http);
for (Map.Entry<String, String> entry : header.entrySet()) {
String key = entry.getKey() != null ? entry.getKey() + ":" : "";
print(key + entry.getValue());
}
} /**
* 发送请求,获取API数据
*
* @param userId
* @return
* http://beta.polyv.net/uc/services/rest?url=http://grap.polyv.net/xxx
* .mp4&title=filename&cataid=xxx&ts=&userid=&sign=
*/
public String httpGetVid(String url) {
String contentStr = "";
String vid = null;
String urlStr = url;
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(urlStr);
try {
CloseableHttpResponse response = httpclient.execute(httpGet);
InputStream is = null;
Scanner sc = null;
Writer os = null;
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
try {
// 2、获取response的entity。
HttpEntity entity = response.getEntity();
is = entity.getContent();
sc = new Scanner(is);
while (sc.hasNext()) {
contentStr = contentStr + sc.nextLine();
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} finally {
if (sc != null) {
sc.close();
}
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
if (response != null) {
response.close();
}
}
} } catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} if (StringUtils.isNotBlank(contentStr)) {
System.out.println("====="+contentStr);
Pattern pattern = Pattern.compile("\"vid\":\"([0-9a-z_]{34})\"");
Matcher matcher = pattern.matcher(contentStr);
if(matcher.find()){
vid = matcher.group(1);
System.out.println(vid);
} } if (vid != null) {
return vid;
} else {
return "";
}
} }

线程池类:

package com.grab.video.listener;

import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory; /**
* Hands out threads from the wrapped threadfactory with setDeamon(true), so the
* threads won't keep the JVM alive when it should otherwise exit.
*/
public class DaemonThreadFactory implements ThreadFactory { private final ThreadFactory factory; /**
* Construct a ThreadFactory with setDeamon(true) using
* Executors.defaultThreadFactory()
*/
public DaemonThreadFactory() {
this(Executors.defaultThreadFactory());
} /**
* Construct a ThreadFactory with setDeamon(true) wrapping the given factory
*
* @param thread
* factory to wrap
*/
public DaemonThreadFactory(ThreadFactory factory) {
if (factory == null)
throw new NullPointerException("factory cannot be null");
this.factory = factory;
} public Thread newThread(Runnable r) {
final Thread t = factory.newThread(r);
t.setDaemon(true);
return t;
}
}

任务运行线程池:

package com.grab.video.listener;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory; import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; public class ExecutorContextListener implements ServletContextListener {
private ExecutorService executor; public void contextInitialized(ServletContextEvent arg0) {
ServletContext context = arg0.getServletContext();
int nr_executors = 3;
ThreadFactory daemonFactory = new DaemonThreadFactory();
try {
nr_executors = Integer.parseInt(context.getInitParameter("nr-executors"));
} catch (NumberFormatException ignore) {
} if (nr_executors <= 1) {
executor = Executors.newSingleThreadExecutor(daemonFactory);
} else {
executor = Executors.newFixedThreadPool(nr_executors, daemonFactory);
}
context.setAttribute("DOWNLOAD_EXECUTOR", executor);
} public void contextDestroyed(ServletContextEvent arg0) {
ServletContext context = arg0.getServletContext();
executor.shutdownNow(); // or process/wait until all pending jobs are
// done
}
}

web.xml(项目启动时,启动任务线程类)

<?

xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="school" version="2.5">
<display-name>Archetype Created Web Application</display-name> <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>com.grab.video.listener.ExecutorContextListener</listener-class>
</listener> <filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> <session-config>
<session-timeout>120</session-timeout>
</session-config> <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<error-page>
<error-code>403</error-code>
<location>/error/403</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error/404</location>
</error-page>
</web-app>

下载页面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <%@ page language="java"
import="java.util.List"
import="com.grab.video.controller.VideoListModel"
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>视频</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> <link href="/resources/bootstrap/css/bootstrap.css" rel="stylesheet" />
<script src="/resources/js/jquery-1.7.2.js"></script> <script type="text/javascript"> var userId; $(document).ready(function(){
userId=$("#userId").val(); var timeId = setInterval(function () { $.ajax({
type: "POST",
url: "/grab/download/status", /* 注意后面的名字相应CS的方法名称 */
data: "{}", /* 注意參数的格式和名称 */
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
//console.log(data);
for(var i in data) {
var percent = data[i].percent;
console.log(percent);
if(percent>0 && percent<100){
$("#progress"+data[i].id).html("<div class='progress'><div class='progress-bar' role='progressbar' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100' style='width:"+ percent+"%;'>"+percent+"%</div></div>");
$("#downloadTd"+data[i].id).html("下载中...");
}else if(percent>100){
percent=100;
$("#progress"+data[i].id).html("<div class='progress'><div class='progress-bar' role='progressbar' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100' style='width:"+ percent+"%;'>"+percent+"%</div></div>");
$("#downloadTd"+data[i].id).html("下载完");
} if(data[i].status=="SUCCESS"){
$("#Tr"+data[i].id).remove();
}else if(data[i].status=="FAIL"){
$("#progress"+data[i].id).html("失败");
//$("#downloadTd"+data[i].id).html("失败");
}
} }
});
},4000);
}); //下载单个文件
function downvideo(obj){ var num="0%";
var htmlstr="<div class='progress'><div class='progress-bar' role='progressbar' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100' style='width:"+ num+";'>"+num+"</div></div>";
$(obj).parents(".downloadTd").siblings(".progressStatus").html(htmlstr); $(obj).parents(".downloadTd").html("下载中..."); var videoId=$(obj).attr("videoId");
var url=$(obj).attr("dataUrl"); //下载
$.post(url,{},function(data){}); var test = setTimeout(function(){
//location.href ="/grab/download/manage?userId="+userId;
},1000);
}
</script> </head> <body>
<div class="container"> <div class="col-md-12"> <div class="page-header clearfix">
<h3 class="pull-left">视频管理</h3>
</div> <div>
<ul class="nav nav-tabs">
<li><a href="/grab/import">导入任务</a></li>
<li class="active"><a href="/grab/download/manage">待抓视频</a></li>
<li><a href="/grab/export">已抓视频</a></li>
</ul>
</div> <input type="hidden" id="userId" name="userId" value="${userId}"/> <%List<VideoListModel> ls = (List) request.getAttribute("videolist");
if(ls.size()>0){%>
<form action="/grab/download/manage" method="post">
<button type="submit" class="btn btn-default btn-info pull-right" style="margin-top:10px;">所有下载</button> <input type="hidden" id="userId" class="userId" name="userId" value="<%=ls.get(0).getUserId() %>" />
<div class="row">
<table id="guanggao-table" class="table table-hover">
<thead>
<tr>
<th>序号</th>
<th>视频URL</th>
<th>标题</th>
<th>视频分类</th>
<th width="15%">状态</th>
<th>操作1</th>
<th>操作2</th>
</tr>
</thead>
<tbody>
<%for(int i=0;i<ls.size();i++){ %>
<tr id="Tr<%=ls.get(i).getId() %>" pUrl="/grab/download/progress?videoId=<%=ls.get(i).getId() %>&trueName=<%=ls.get(i).getTrueName() %>&userId=<%=ls.get(i).getUserId() %>&url=<%=ls.get(i).getUrl() %>" >
<td> <%=i+1 %>
<input type="hidden" id="videoId" class="videoId" name="videoId" value="<%=ls.get(i).getId() %>" />
<input type="hidden" id="url" class="url" name="url" value="<%=ls.get(i).getUrl() %>" />
<input type="hidden" id="trueName" class="trueName" name="trueName" value="<%=ls.get(i).getTrueName() %>" />
</td>
<td>
<a href="<%=ls.get(i).getUrl() %>" title="<%=ls.get(i).getUrl() %>"><%String str=ls.get(i).getUrl();String pathstr=str.substring(0, 20);%>
<%=pathstr %>...
</a>
</td>
<td><%=ls.get(i).getTitle() %></td>
<td><%=ls.get(i).getClassifyName() %></td>
<td class="progressStatus" id="progress<%=ls.get(i).getId() %>"> <% if("NO".equals(ls.get(i).getStatus().trim())){%>
<div>待抓取</div>
<%}else if("WAIT".equals(ls.get(i).getStatus().trim())){ %>
<div>等待</div>
<%}else if("TRANSCODING".equals(ls.get(i).getStatus().trim())){ %>
<div class="progress">
<div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width:1%;">1%</div>
</div>
<%}else if("EXECUTE".equals(ls.get(i).getStatus().trim())){ %> <%}else if("SUCCESS".equals(ls.get(i).getStatus().trim())){ %>
<div>成功</div>
<%}else{ %>
<div>失败 </div>
<%} %>
</td>
<td class="downloadTd" id="downloadTd<%=ls.get(i).getId() %>">
<% if("EXECUTE".equals(ls.get(i).getStatus().trim())){%>
下载中...<div class="execute" videoId="<%=ls.get(i).getId() %>" style="display:none;"></div> <%}else if("WAIT".equals(ls.get(i).getStatus().trim())){ %>
等待
<%}else{%>
<button type="button" class="btn btn-default btn-info" videoId="<%=ls.get(i).getId() %>" dataUrl="/grab/download/manage? videoId=<%=ls.get(i).getId() %>&trueName=<%=ls.get(i).getTrueName() %>&userId=<%=ls.get(i).getUserId() %>&url=<%=ls.get(i).getUrl() %>" onclick="downvideo(this);">抓取</button>
<%} %>
</td>
<td>
<!--
<button type="button" class="btn btn-default" videoId="<%=ls.get(i).getId() %>" dataUrl="/grab/video/stop?videoId=<%=ls.get(i).getId() %>&trueName=<%=ls.get(i).getTrueName() %>&userId=<%=ls.get(i).getUserId() %>&url=<%=ls.get(i).getUrl() %>" onclick="stopVideo(this);">暂停</button>
-->
<button type="button" class="btn btn-default" videoId="<%=ls.get(i).getId() %>" dataUrl="/grab/delete/videoId? videoId=<%=ls.get(i).getId() %>" onclick="deleteVideo(this);">删除</button>
</td>
</tr>
<%} %>
</tbody>
</table>
</div>
</form>
<%}else{ %>
<div class="col-md-6" style="padding-top:30px;">暂无视频能够抓取</div>
<%} %> </div>
</div> </body>
</html> <script>
//删除文件
function deleteVideo(obj){
var url=$(obj).attr("dataUrl"); if (!confirm('真的要永久删除该内容吗?')) {
return ;
}else{
$.ajax({
type: "GET",
url: url, /* 注意后面的名字相应CS的方法名称 */
data: "{}", /* 注意參数的格式和名称 */
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
console.log(data);
var mark=data.result;
if(mark=="yes"){
// window.location.reload();
location.href ="/grab/download/manage?userId="+userId;
}else{
alert("删除失败!");
} }
});
}
} //暂停下载
function stopVideo(obj){
var url=$(obj).attr("dataUrl"); if (!confirm('暂停下载')) {
return ;
}else{
$.ajax({
type: "GET",
url: url, /* 注意后面的名字相应CS的方法名称 */
data: "{}", /* 注意參数的格式和名称 */
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
console.log(data);
var mark=data.result;
if(mark=="yes"){
// window.location.reload();
location.href ="/grab/download/manage?userId="+userId;
}else{
alert("操作失败!");
} }
});
}
} </script>

版权声明:本文博主原创文章,博客,未经同意不得转载。

JavaHTTP下载视频的更多相关文章

  1. 使用you-get下载视频网站视频或其他

    使用you-get下载视频网站视频或其他 文/玄魂 目录 使用you-get下载视频网站视频或其他 前言 1.1 下载.安装 依赖 exe安装 pip安装 Antigen安装 Git 克隆源码 Hom ...

  2. 在Windows上安装FFmpeg程序的方法(you-get下载视频必备程序)

    FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库libavcodec. 该程序 ...

  3. you-get 下载视频

    亲测有效,没在别的平台试,道理是相通的 平台:Windows 10 所需工具: python3,pip3,you-get 步骤流程: 正确安装python3,配置环境变量 (目前使用的是3.6+) 打 ...

  4. Python3 根据m3u8下载视频,批量下载ts文件并且合并

    Python3 根据m3u8下载视频,批量下载ts文件并且合并 m3u8是苹果公司推出一种视频播放标准,是一种文件检索格式,将视频切割成一小段一小段的ts格式的视频文件,然后存在服务器中(现在为了减少 ...

  5. python you-get 下载视频

    python使用you-get模块下载视频   pip install you-get # 安装先 怎么用    进入命令行: you-get url 暂停下载:ctrl + c ,继续下载重复  y ...

  6. AsyncTask 异步任务基本使用-下载视频

    概述 android 提供了一个异步任务类AsyncTask,使创建异步任务.更新UI变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务.本例子将演示并实现,使用AsyncTas ...

  7. 利用python下载视频

    我们知道,有些网页上的视频,没有下载的按钮,并且有些视频需要付费下载,很多同学因此很苦恼.不怕,有问题找我,我试试用程序员的方式通俗易懂教会大家. 1.你先下载一个Python,不会下载的同学可以看这 ...

  8. requests模块下载视频 显示进度和网速

    requests 下载视频 import os,time import requests def downloadFile(name, url): headers = {'Proxy-Connecti ...

  9. IDM下载器使用方法详解:百度网盘下载,视频会员一网打尽!

    一. IDM的设置 [01]IDM插件与各大浏览器的集成 默认情况下,在成功安装IDM后,直接点击这里的选项,会弹出[常规设置],一般情况下直接保持默认的配置即可,如果你使用的是比较小众的浏览器,你可 ...

随机推荐

  1. LLVM每日谈21 一些编译器和LLVM/Clang代码

    作者:闪亮宁(snsn1984) 一些自己的收藏LLVM/Clang代码,而他自己写一些一点点LLVM/Clang译器的代码.在这里把这些代码库分享出来,欢迎大家交流探讨. 1.crange http ...

  2. 【Cocos2d-X开发学习笔记】第01期:PC开发环境的详细搭建

    本文使用的是cocos2d-x-2.1.4版本 ,截至目前为止是最新稳定版 所谓的开发环境就是制作游戏的地方,打个比方读者就会十分清楚了.比如提到做饭,人们都会想到厨房.这是 因为厨房有炉灶.烟机.水 ...

  3. 诺贝尔物理学奖公布:LED灯将点亮了整个21世纪

    很多其它精彩.破晓博客:点击打开链接 7日.在瑞典首都斯德哥尔摩,瑞典皇家科学院常任秘书诺尔马克(左二)宣布2014年诺贝尔物理学奖得主.新华社发 ■人物 中村修二 勇于追讨酬劳的科学家 被誉为&qu ...

  4. Linux下安装Python3.3.0

    Linux下安装Python3.3.0_路易_新浪博客 Linux下安装Python3.3.0 (2013-01-08 11:45:37)

  5. [poj 1127]Jack Straws[线段相交][并查集]

    题意: 给出一系列线段,判断某两个线段是否连通. 思路: 根据线段相交情况建立并查集, 在同一并查集中则连通. (第一反应是强连通分量...实际上只要判断共存即可, 具体的方向啊是没有关系的..) 并 ...

  6. 自写jquery网页回到顶部效果,渐隐图标,引用js文件就可以

    唔.进来开发需求,当网页内容草鸡多的时候,用户就须要有个button高速回到顶部,而不是自己去滚滑轮~ 原本以为比較难的说,由于上头要求所实用js来实现,哪个页面引用,哪个页面显示. 于是乎,本屌丝就 ...

  7. Django Form Media 阅读笔记

    ---恢复内容开始--- Form Media Rendering an attractive and easy-to-use Web form requires more than just HTM ...

  8. Cocos2d-x Tiled地图编辑器(一)基本使用

    Tiled地图编辑器支持普通视角地图和45度角地图, 它生成的地图数据文件cocos2d-x完美的支持,Tiled地图编辑器是一个以普通使用为目标地图编辑器,它使用简单而且能够轻松地在不同的游戏引擎中 ...

  9. SVN的CheckOut操作和Export操作的区别

  10. String的Split方法的用法与要注意事项

    转自:http://shukuiyan.iteye.com/blog/1058672 之前在http://shukuiyan.iteye.com/blog/507915文中已经叙述过这个问题,但是最近 ...