婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > ajax 異步上傳帶進度條視頻并提取縮略圖

ajax 異步上傳帶進度條視頻并提取縮略圖

熱門標簽:青海醫療智能外呼系統怎么樣 老虎郵局地圖標注點 目標三維地圖標注 襄陽外呼系統接口 外呼系統獲取客戶手機號 上海浦東百度地圖標注中心注冊 百靈鳥 徐州電銷卡外呼系統供應商 科智聯智能電銷機器人

最近在做一個集富媒體功能于一身的項目。需要上傳視頻。這里我希望做成異步上傳,并且有進度條,響應有狀態碼,視頻連接,縮略圖。

服務端響應

 {
   "thumbnail": "/slsxpt//upload/thumbnail/fdceefc.jpg",
   "success": true,
   "link": "/slsxpt//upload/video/fdceefc.mp"
 }

并且希望我的input file控件不要被form標簽包裹。原因是form中不能嵌套form,另外form標簽在瀏覽器了還是有一點點默認樣式的,搞不好又要寫css。

以前用ajaxFileUpload做過文件異步上傳。不過這個東西好久未更新,代碼還有bug,雖然最后勉強成功用上了,但總覺不好。而且ajaxFileUpload沒有直接添加xhr2的progress事件響應,比較麻煩。

上網找了一下,發現方法都是很多。

比如在文件上傳后,將上傳進度放到session中,輪詢服務器session。但我總覺的這個方法有問題,我認為這種方法看到的進度,應該是我的服務端應用程序代碼(我的也就是action)從服務器的臨時目錄復制文件的進度,因為所有請求都應該先提交給服務器軟件,也就是tomcat,tomcat對請求進行封裝session,request等對象,并且文件實際上也應該是它來接收的。也就是說在我的action代碼執行之前,文件實際上已經上傳完畢了。

后來找到個比較好的方法使用 jquery.form.js插件的ajaxSubmit方法。這個方法以表單來提交,也就是 $.fn.ajaxSubmit.:$(form selector).ajaxSubmit({}),這個api的好處是它已經對xhr2的progress時間進行了處理,可以在調用時傳遞一個uploadProgress的function,在function里就能夠拿到進度。而且如果不想input file被form包裹也沒關系,在代碼里createElement應該可以。不過這個方法我因為犯了個小錯誤最后沒有成功,可惜了。

ajaxSubmit源碼

最后,還是使用了$.ajax 方法來做。$.ajax 不需要關聯form,有點像個靜態方法哦。唯一的遺憾就是$.ajax options里沒有對progress的響應。不過它有一個參數為 xhr ,也就是你可以定制xhr,那么久可以通過xhr添加progress的事件處理程序。再結合看一看ajaxSubmit方法里對progress事件的處理,頓時豁然開朗

那么我也可以在$.ajax 方法中添加progress事件處理函數了。為了把對dom的操作從上傳業務中抽取出來,我決定以插件的形式寫。下面是插件的代碼

 ;(function ($) {
   var defaults = {
       uploadProgress    :  null,
       beforeSend      :  null,
       success        :  null,
     },
     setting = {
     };
   var upload = function($this){
     $this.parent().on('change',$this,function(event){
       //var $this = $(event.target),
       var  formData = new FormData(),
         target = event.target || event.srcElement;
       //$.each(target.files, function(key, value)
       //{
       //  console.log(key);
       //  formData.append(key, value);
       //});
       formData.append('file',target.files[]);
       settings.fileType  formData.append('fileType',settings.fileType);
       $.ajax({
         url        :  $this.data('url'),
         type      :  "POST",
         data      :  formData,
         dataType    :  'json',
         processData    :  false,
         contentType    :  false,
         cache      :  false,
         beforeSend    :  function(){
           //console.log('start');
           if(settings.beforeSend){
             settings.beforeSend();
           }
         },
         xhr        :   function() {
           var xhr = $.ajaxSettings.xhr();
           if(xhr.upload){
             xhr.upload.addEventListener('progress',function(event){
               var total = event.total,
                 position = event.loaded || event.position,
                 percent = ;
               if(event.lengthComputable){
                 percent = Math.ceil(position / total * );
               }
               if(settings.uploadProgress){
                 settings.uploadProgress(event, position, total, percent);
               }
             }, false);
           }
           return xhr;
         },
         success      :  function(data,status,jXhr){
           if(settings.success){
             settings.success(data);
           }
         },
         error      :  function(jXhr,status,error){
           if(settings.error){
             settings.error(jXhr,status,error);
           }
         }
       });
     });
   };
   $.fn.uploadFile = function (options) {
     settings = $.extend({}, defaults, options);
     // 文件上傳
     return this.each(function(){
       upload($(this));
     });
   }
 })($ || jQuery);

下面就可以在我的jsp頁面里面使用這個api了。

div class="col-sm-">
   input type="text" name="resource_url" id="resource_url" hidden="hidden"/>
   div class="progress" style='display: none;'>
     div class="progress-bar progress-bar-success uploadVideoProgress" role="progressbar"
        aria-valuenow="" aria-valuemin="" aria-valuemax="" style="width: %">
     /div>
   /div>
   input type="file" class="form-control file inline btn btn-primary uploadInput uploadVideo"
      accept="video/mp"
      data-url="${baseUrl}/upload-video.action"
      data-label="i class='glyphicon glyphicon-circle-arrow-up'>/i> nbsp;選擇文件" />
   script>
     (function($){
       $(document).ready(function(){
         var $progress  = $('.uploadVideoProgress'),
             start = false;
         $('input.uploadInput.uploadVideo').uploadFile({
           beforeSend   : function(){
             $progress.parent().show();
           },
           uploadProgress : function(event, position, total, percent){
             $progress.attr('aria-valuenow',percent);
             $progress.width(percent+'%');
             if(percent >= ){
               $progress.parent().hide();
               $progress.attr('aria-valuenow',);
               $progress.width(+'%');
             }
           },
           success     : function(data){
             if(data.success){
               setTimeout(function(){
                 $('#thumbnail').attr('src',data.thumbnail);
               },);
             }
           }
         });
       });
     })(jQuery);
   /script>
 /div>

這里在響應succes的時候設置超時800毫秒之后獲取圖片,因為提取縮量圖是另一個進程在做可能響應完成的時候縮略圖還沒提取完成

看下效果

提取縮量圖

下面部分就是服務端處理上傳,并且對視頻提取縮量圖下面是action的處理代碼

package org.lyh.app.actions;
 import org.apache.commons.io.FileUtils;
 import org.apache.struts.ServletActionContext;
 import org.lyh.app.base.BaseAction;
 import org.lyh.library.SiteHelpers;
 import org.lyh.library.VideoUtils;
 import java.io.File;
 import java.io.IOException;
 import java.security.KeyStore;
 import java.util.HashMap;
 import java.util.Map;
 /**
 * Created by admin on //.
 */
 public class UploadAction extends BaseAction{
   private String saveBasePath;
   private String imagePath;
   private String videoPath;
   private String audioPath;
   private String thumbnailPath;
   private File file;
   private String fileFileName;
   private String fileContentType;
   // 省略setter getter方法
   public String video() {
     MapString, Object> dataJson = new HashMapString, Object>();
     System.out.println(file);
     System.out.println(fileFileName);
     System.out.println(fileContentType);
     String fileExtend = fileFileName.substring(fileFileName.lastIndexOf("."));
     String newFileName = SiteHelpers.md(fileFileName + file.getTotalSpace());
     String typeDir = "normal";
     String thumbnailName = null,thumbnailFile = null;
     boolean needThumb = false,extractOk = false;
     if (fileContentType.contains("video")) {
       typeDir = videoPath;
       // 提取縮量圖
       needThumb = true;
       thumbnailName = newFileName + ".jpg";
       thumbnailFile
           = app.getRealPath(saveBasePath + thumbnailPath) + "/" + thumbnailName;
     }
     String realPath = app.getRealPath(saveBasePath + typeDir);
     File saveFile = new File(realPath, newFileName + fileExtend);
     // 存在同名文件,跳過
     if (!saveFile.exists()) {
       if (!saveFile.getParentFile().exists()) {
         saveFile.getParentFile().mkdirs();
       }
       try {
         FileUtils.copyFile(file, saveFile);
         if(needThumb){
           extractOk = VideoUtils.extractThumbnail(saveFile, thumbnailFile);
           System.out.println("提取縮略圖成功:"+extractOk);
         }
         dataJson.put("success", true);
       } catch (IOException e) {
         System.out.println(e.getMessage());
         dataJson.put("success", false);
       }
     }else{
       dataJson.put("success", true);
     }
     if((Boolean)dataJson.get("success")){
       dataJson.put("link",
           app.getContextPath() + "/" + saveBasePath + typeDir + "/" + newFileName + fileExtend);
       if(needThumb){
         dataJson.put("thumbnail",
             app.getContextPath() + "/" + saveBasePath + thumbnailPath + "/" + thumbnailName);
       }
     }
     this.responceJson(dataJson);
     return NONE;
   }
 }

action配置

 action name="upload-*" class="uploadAction" method="{}">
     param name="saveBasePath">/upload/param>
     param name="imagePath">/images/param>
     param name="videoPath">/video/param>
     param name="audioPath">/audio/param>
     param name="thumbnailPath">/thumbnail/param>
 /action>

這里個人認為,如果文件的名稱跟大小完全一樣的話,它們是一個文件的概率就非常大了,所以我這里取文件名跟文件大小做md5運算,應該可以稍微避免下重復上傳相同文件了。

轉碼的時候用到FFmpeg。需要的可以去這里下載。

package org.lyh.library;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
 /**
 * Created by admin on //.
 */
 public class VideoUtils {
   public static final String FFMPEG_EXECUTOR = "C:/Software/ffmpeg.exe";
   public static final int THUMBNAIL_WIDTH = ;
   public static final int THUMBNAIL_HEIGHT = ;
   public static boolean extractThumbnail(File inputFile,String thumbnailOutput){
     ListString> command = new ArrayListString>();
     File ffmpegExe = new File(FFMPEG_EXECUTOR);
     if(!ffmpegExe.exists()){
       System.out.println("轉碼工具不存在");
       return false;
     }
     System.out.println(ffmpegExe.getAbsolutePath());
     System.out.println(inputFile.getAbsolutePath());
     command.add(ffmpegExe.getAbsolutePath());
     command.add("-i");
     command.add(inputFile.getAbsolutePath());
     command.add("-y");
     command.add("-f");
     command.add("image");
     command.add("-ss");
     command.add("");
     command.add("-t");
     command.add(".");
     command.add("-s");
     command.add(THUMBNAIL_WIDTH+"*"+THUMBNAIL_HEIGHT);
     command.add(thumbnailOutput);
     ProcessBuilder builder = new ProcessBuilder();
     builder.command(command);
     builder.redirectErrorStream(true);
     try {
       long startTime = System.currentTimeMillis();
       Process process = builder.start();
       System.out.println("啟動耗時"+(System.currentTimeMillis()-startTime));
       return true;
     } catch (IOException e) {
       e.printStackTrace();
       return false;
     }
   }
 }

另外這里由java啟動了另外一個進程,在我看來他們應該是互不相干的,java啟動了ffmpeg.exe之后,應該回來繼續執行下面的代碼,所以并不需要單獨起一個線程去提取縮量圖。測試看也發現耗時不多。每次長傳耗時也區別不大,下面是兩次上傳同一個文件耗時

第一次

第二次

就用戶體驗來說沒有很大的區別。

另外這里上傳較大文件需要對tomcat和struct做點配置

修改tomcat下conf目錄下的server.xml文件,為Connector節點添加屬性 maxPostSize="0"表示不顯示上傳大小

另外修改 struts.xml添加配置,這里的value單位為字節,這里大概300多mb

您可能感興趣的文章:
  • ajax實現異步文件或圖片上傳功能
  • ajax圖片上傳,圖片異步上傳,更新實例
  • Ajax異步文件上傳與NodeJS express服務端處理
  • Ajax異步上傳文件實例代碼分享
  • ajax實現文件異步上傳并回顯文件相關信息功能示例
  • jquery中的ajax異步上傳
  • Ajax表單異步上傳文件實例代碼(包括文件域)
  • 表單上傳功能實現 ajax文件異步上傳
  • ajax異步實現文件分片上傳實例代碼

標簽:咸寧 商洛 辛集 揭陽 佛山 荊州 紅河 股票

巨人網絡通訊聲明:本文標題《ajax 異步上傳帶進度條視頻并提取縮略圖》,本文關鍵詞  ajax,異步,上傳,帶,進度,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《ajax 異步上傳帶進度條視頻并提取縮略圖》相關的同類信息!
  • 本頁收集關于ajax 異步上傳帶進度條視頻并提取縮略圖的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产久卡久卡久卡久卡视频精品| 欧美理论电影在线| 99精品视频免费在线观看| 日韩视频一区二区三区| 一区二区三区在线免费视频| 91丨porny丨最新| 综合久久综合久久| 成人av中文字幕| 国产精品嫩草影院av蜜臀| 国产精一区二区三区| 成人午夜碰碰视频| 亚洲福利视频一区二区| 欧洲视频一区二区| 丝袜诱惑亚洲看片| 国产一区二三区好的| 欧美极品另类videosde| 国产91丝袜在线18| 亚洲乱码日产精品bd| 欧美影视一区在线| 久久久久99精品国产片| 亚洲一区在线看| 日韩免费看的电影| 丰满少妇在线播放bd日韩电影| 国产精品久久久久久久久动漫| 色综合天天综合网天天狠天天| 国产精品久久久久婷婷二区次| 91美女视频网站| 亚洲444eee在线观看| 国产亚洲欧美激情| 欧美日韩一区二区三区免费看 | 欧美日韩高清一区二区不卡| 美腿丝袜在线亚洲一区| 国产一区二区三区在线观看精品| 国产综合色产在线精品| 成人性视频免费网站| 91成人免费电影| 亚洲裸体在线观看| 丝袜诱惑亚洲看片| 久久精品亚洲国产奇米99| 91久久精品国产91性色tv| 精品夜夜嗨av一区二区三区| 中文字幕日韩精品一区| 日韩视频免费观看高清完整版| www.99精品| 五月婷婷综合激情| 欧美一区二区三区人| 欧美国产禁国产网站cc| 欧美变态tickle挠乳网站| 欧美综合视频在线观看| 国产在线国偷精品产拍免费yy| 亚洲国产成人av网| 亚洲日韩欧美一区二区在线| 欧美不卡一区二区三区四区| 欧美嫩在线观看| 91九色最新地址| 久久99国产精品免费| 成人免费在线视频观看| 91色乱码一区二区三区| 国产综合色视频| 日韩精品成人一区二区在线| 中文字幕精品—区二区四季| 2024国产精品视频| 欧美一级免费观看| 欧美视频三区在线播放| 成人毛片视频在线观看| 国产成人av一区二区三区在线| 亚洲欧洲日韩综合一区二区| 日韩一区二区三区在线观看 | 亚洲欧洲国产日本综合| 国产麻豆成人传媒免费观看| 亚洲一级在线观看| 欧美精品久久天天躁| 97精品视频在线观看自产线路二| 国产精品综合网| 国产激情一区二区三区四区| 美国欧美日韩国产在线播放| 国产曰批免费观看久久久| 国产成人精品影视| 久久不见久久见中文字幕免费| 国产精品丝袜91| 一区二区中文字幕在线| 亚洲老妇xxxxxx| 亚洲综合色网站| 毛片一区二区三区| 国产一区二区福利视频| 亚洲高清在线视频| 制服丝袜亚洲播放| 这里只有精品视频在线观看| 欧美成人高清电影在线| 久久夜色精品国产欧美乱极品| 不卡的电影网站| 欧美日韩激情一区二区| 日韩一区二区三区视频在线观看| 91精品久久久久久久91蜜桃| 日韩精品在线看片z| 国产视频一区二区三区在线观看| **欧美大码日韩| 亚洲欧美日韩在线| 日本欧美一区二区在线观看| 国产欧美1区2区3区| 久久精品亚洲麻豆av一区二区| 亚洲精品视频在线看| 日本人妖一区二区| 成人aaaa免费全部观看| 欧美日韩你懂的| 国产亲近乱来精品视频| 一区二区不卡在线视频 午夜欧美不卡在| 午夜精品免费在线观看| 亚洲品质自拍视频网站| 色综合久久综合中文综合网| 日韩精品影音先锋| 亚洲精品成人天堂一二三| 老司机精品视频在线| 一本到不卡免费一区二区| 亚洲国产精品一区二区www在线| 国产精品另类一区| 精品午夜一区二区三区在线观看| 91精品国产色综合久久不卡蜜臀| 洋洋成人永久网站入口| 欧美日韩一区精品| 精品亚洲国产成人av制服丝袜| 9191成人精品久久| 精品综合免费视频观看| 欧日韩精品视频| 亚洲欧美激情一区二区| 欧美男人的天堂一二区| 国产99久久久国产精品潘金网站| 国产色综合久久| 日韩和欧美一区二区三区| 精品久久久久香蕉网| 日韩av中文在线观看| 日韩一区二区在线看片| 国产精品高潮久久久久无| 国产91丝袜在线播放| av不卡免费在线观看| 99久久99久久精品免费看蜜桃| 日韩欧美亚洲国产精品字幕久久久 | 久久综合色天天久久综合图片| 一区二区三区在线观看网站| 国产毛片精品视频| 日韩欧美精品在线视频| 亚洲狠狠爱一区二区三区| 91丨九色丨国产丨porny| 一本色道久久加勒比精品| 日本欧美韩国一区三区| 欧美精彩视频一区二区三区| av亚洲精华国产精华精华| 亚洲国产三级在线| 91国偷自产一区二区使用方法| 国产精品福利影院| 丁香五精品蜜臀久久久久99网站 | 国产欧美日本一区二区三区| 久久99精品久久久久久动态图| 欧美一区二区三区在线| 天堂久久久久va久久久久| 精品视频在线免费| 一区二区免费看| 欧美在线高清视频| 欧美激情一区二区三区蜜桃视频 | 成人一区在线观看| 国产网站一区二区| 91麻豆精品国产91久久久更新时间| 成人精品小蝌蚪| 91麻豆免费在线观看| 亚洲宅男天堂在线观看无病毒 | 中文字幕av一区二区三区高 | 欧美成人性战久久| 韩国三级在线一区| 国产欧美精品一区二区色综合朱莉| 久久成人免费日本黄色| 久久综合狠狠综合久久激情| 国产精品18久久久久久久久久久久 | 一本色道**综合亚洲精品蜜桃冫| 国产一区二区在线看| 老色鬼精品视频在线观看播放| 日韩精品一级二级| 久久一区二区视频| 国产亚洲欧美色| 色婷婷亚洲精品| 图片区小说区区亚洲影院| 欧美一级日韩一级| 国产夫妻精品视频| 亚洲精品乱码久久久久久| 欧美特级限制片免费在线观看| 欧美国产亚洲另类动漫| 久久精品亚洲精品国产欧美kt∨| 日韩欧美电影一区| 99re亚洲国产精品| 久久福利资源站| ●精品国产综合乱码久久久久| 91黄色小视频| 激情综合网激情| 亚洲精品乱码久久久久久久久| 欧美日韩精品免费| 成人动漫精品一区二区| 国产精品不卡在线| 91色视频在线| 国产91清纯白嫩初高中在线观看| 国产成人亚洲综合色影视| 99久久99久久免费精品蜜臀|