How can I set preview of video file, selecting from input type='file'

61,786

Solution 1

@FabianQuiroga is right that you should better use createObjectURL than a FileReader in this case, but your problem has more to do with the fact that you set the src of a <source> element, so you need to call videoElement.load().

$(document).on("change", ".file_multi_video", function(evt) {
  var $source = $('#video_here');
  $source[0].src = URL.createObjectURL(this.files[0]);
  $source.parent()[0].load();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<video width="400" controls>
  <source src="mov_bbb.mp4" id="video_here">
    Your browser does not support HTML5 video.
</video>

<input type="file" name="file[]" class="file_multi_video" accept="video/*">

Ps: don't forget to call URL.revokeObjectURL($source[0].src) when you don't need it anymore.

Solution 2

Do not forget that it uses jquery library

Javascript

$ ("#video_p").change(function () {
   var fileInput = document.getElementById('video_p');
   var fileUrl = window.URL.createObjectURL(fileInput.files[0]);
   $(".video").attr("src", fileUrl);
});

Html

< video controls class="video" >
< /video >

Solution 3

If you are facing this issue. Then you can use the below method to resolve the above issue.

Here is the html code:

//input tag to upload file
<input class="upload-video-file" type='file' name="file"/>

//div for video's preview
 <div style="display: none;" class='video-prev' class="pull-right">
       <video height="200" width="300" class="video-preview" controls="controls"/>
 </div>

Here is the JS function below:

$(function() {
    $('.upload-video-file').on('change', function(){
      if (isVideo($(this).val())){
        $('.video-preview').attr('src', URL.createObjectURL(this.files[0]));
        $('.video-prev').show();
      }
      else
      {
        $('.upload-video-file').val('');
        $('.video-prev').hide();
        alert("Only video files are allowed to upload.")
      }
    });
});

// If user tries to upload videos other than these extension , it will throw error.
function isVideo(filename) {
    var ext = getExtension(filename);
    switch (ext.toLowerCase()) {
    case 'm4v':
    case 'avi':
    case 'mp4':
    case 'mov':
    case 'mpg':
    case 'mpeg':
        // etc
        return true;
    }
    return false;
}

function getExtension(filename) {
    var parts = filename.split('.');
    return parts[parts.length - 1];
}

Solution 4

Lets make it easy

HTML:

<video width="100%" controls class="myvideo" style="height:100%">
<source src="mov_bbb.mp4" id="video_here">
Your browser does not support HTML5 video.
</video>

JS:

function readVideo(input) {

    if (input.files && input.files[0]) {
        var reader = new FileReader();   
        reader.onload = function(e) {
            $('.myvideo').attr('src', e.target.result);
        };

        reader.readAsDataURL(input.files[0]);
    }
}

Solution 5

Here is an easy peasy solution

document.getElementById("videoUpload").onchange = function(event) {
  let file = event.target.files[0];
  let blobURL = URL.createObjectURL(file);
  document.querySelector("video").style.display = 'block';
  document.querySelector("video").src = blobURL;
}
<input type='file'  id='videoUpload'/>

<video width="320" height="240" style="display:none" controls autoplay>
  Your browser does not support the video tag.
</video>

the solution is using vanilla js so you don't need JQuery with it, tested and works on chrome, Goodluck

Share:
61,786
Ronak Patel
Author by

Ronak Patel

Full Stack developer. (expert in PHP frameworks, Web Designing , JS, HTML, CSS, Javascript AngularJS, Angular)

Updated on November 09, 2021

Comments

  • Ronak Patel
    Ronak Patel over 2 years

    In one of my module, I need to browse video from input[type='file'], after that I need to show selected video before starting upload.

    I am using basic HTML tag to show. but it is not working.

    Here is code:

    $(document).on("change",".file_multi_video",function(evt){
      
      var this_ = $(this).parent();
      var dataid = $(this).attr('data-id');
      var files = !!this.files ? this.files : [];
      if (!files.length || !window.FileReader) return; 
      
      if (/^video/.test( files[0].type)){ // only video file
        var reader = new FileReader(); // instance of the FileReader
        reader.readAsDataURL(files[0]); // read the local file
        reader.onloadend = function(){ // set video data as background of div
              
              var video = document.getElementById('video_here');
              video.src = this.result;
          }
       }
      
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    
    <video width="400" controls >
                  <source src="mov_bbb.mp4" id="video_here">
                Your browser does not support HTML5 video.
              </video>
    
    
     <input type="file" name="file[]" class="file_multi_video" accept="video/*">

  • Carlos Med
    Carlos Med over 6 years
    Should be the accepted answer! By the way, what´s the impact of not doing URL.revokeObjectURL($source[0].src) at any point ?
  • Kaiido
    Kaiido over 6 years
    @CarlosArturoFyuler in this exact case (a user provided File through input[type=file], not so much... The blobURI returned by createObjectURL here just holds a direct symlink to the file on the user's disk, so the memory impact is less than important. But in other cases, it does have real consequences: an unrevoked blobURI from a generated or fetched Blob will hold its data in memory until the session ends. And even worse, with MediaStream, like gUM (at the time this answer was written cOU was still the way to display MediaStreams, now deprecated), it may block the device (e.g web-cam).
  • Carlos Med
    Carlos Med over 6 years
    Thank's for the clarification :)
  • Fernando Torres
    Fernando Torres almost 4 years
    $source.parent(...)[0].load is not a function
  • Drmzindec
    Drmzindec almost 3 years
    jQuery is still being used by many major web platforms and coding a whole VUE or React component just to display a video isnt feasible. jQuery is still relevant and supported.
  • AhrenFullStop
    AhrenFullStop over 2 years
    Jquery is supported just like my nokia 3310 can still make calls on my network. That doesn't mean you shouldn't try and move forward with the times. JQuery is trash.
  • Amit kumar
    Amit kumar over 2 years
    @Kaiido i'm sorry i don't know much about URL.revokeObjectURL($source[0].src) so could you tell me in the above code where exactly should i call URL.revokeObjectURL($source[0].src)?
  • Kaiido
    Kaiido over 2 years
    @Amitkumar when you don't need the blob URI anymore, so generally once the resource has been fetched, here when the <video> has been fully loaded, though if it's a big file beware that the browser may only keep chunks of it in memory and fetch it again, moreover since here the File comes from the user's disk, there is on real penalty in keeping the blob URI active, it's just a pointer to the file on disk, not in memory.
  • minjunkim7767
    minjunkim7767 over 2 years
    how do I disable the option on the player that lets any people download the video file?