ARTICLE AD BOX
Asked 15 years, 2 months ago
Viewed 1.9m times
I want to be able to preview a file (image) before it is uploaded. The preview action should be executed all in the browser without using Ajax to upload the image.
How can I do this?
2
10 Comments
There are a couple ways you can do this. The most efficient way would be to use URL.createObjectURL() on the File from your <input>. Pass this URL to img.src to tell the browser to load the provided image.
Here's an example:
You can also use FileReader.readAsDataURL() to parse the file from your <input>. This will create a string in memory containing a base64 representation of the image.
22.4k10 gold badges94 silver badges80 bronze badges
5 Comments
Read carefully: When an image is uploaded using the file input, it is stored in the browser's cache. The URL.createObjectURL() will create a link to the cached image on the browser. To create the base64 string of the file which can be stored in a database use readAsDataURL.
2020-10-29T11:33:42.05Z+00:00
One-liner solution:
The following code uses object URLs, which is much more efficient than data URL for viewing large images (A data URL is a huge string containing all of the file data, whereas an object URL, is just a short string referencing the file data in-memory):
Generated URL will be like:
blob:http%3A//localhost/7514bc74-65d4-4cf0-a0df-3de0168243452 Comments
Beautiful. But what about clearing memory using URL.revokeObjectURL()? :D
2021-03-27T07:10:23.71Z+00:00
Try This
To PREVIEW the image before uploading it to the SERVER from the Browser without using Ajax or any complicated functions.
It needs an "onChange" event to load the image.
To preview multiple image click here
2 Comments
IMPORTANT: If/when using this method it's necessary to remove the object URL to prevent memory leaks. This is done by calling URL.revokeObjectURL(myObjectUrl), where myObjectUrl is the object URL created (this means that you'll need to assign the Object URL to a temporary variable before setting the image src). See developer.mozilla.org/en-US/docs/Web/API/URL/….
2021-01-15T21:13:23.603Z+00:00
The answer of LeassTaTT works well in "standard" browsers like FF and Chrome. The solution for IE exists but looks different. Here description of cross-browser solution:
In HTML we need two preview elements, img for standard browsers and div for IE
HTML:
<img id="preview" src="" alt="" style="display:none; max-width: 160px; max-height: 120px; border: none;"/> <div id="preview_ie"></div>In CSS we specify the following IE specific thing:
CSS:
#preview_ie { FILTER: progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale) }In HTML we include the standard and the IE-specific Javascripts:
<script type="text/javascript"> {% include "pic_preview.js" %} </script> <!--[if gte IE 7]> <script type="text/javascript"> {% include "pic_preview_ie.js" %} </script>The pic_preview.js is the Javascript from the LeassTaTT's answer. Replace the $('#blah') whith the $('#preview') and add the $('#preview').show()
Now the IE specific Javascript (pic_preview_ie.js):
function readURL (imgFile) { var newPreview = document.getElementById('preview_ie'); newPreview.filters.item('DXImageTransform.Microsoft.AlphaImageLoader').src = imgFile.value; newPreview.style.width = '160px'; newPreview.style.height = '120px'; }That's is. Works in IE7, IE8, FF and Chrome. Please test in IE9 and report. The idea of IE preview was found here: http://forums.asp.net/t/1320559.aspx
http://msdn.microsoft.com/en-us/library/ms532969(v=vs.85).aspx
This is size improvement of cmlevy answer - try
I have edited @Ivan's answer to display "No Preview Available" image, if it is not an image:
function readURL(input) { var url = input.value; var ext = url.substring(url.lastIndexOf('.') + 1).toLowerCase(); if (input.files && input.files[0]&& (ext == "gif" || ext == "png" || ext == "jpeg" || ext == "jpg")) { var reader = new FileReader(); reader.onload = function (e) { $('.imagepreview').attr('src', e.target.result); } reader.readAsDataURL(input.files[0]); }else{ $('.imagepreview').attr('src', '/assets/no_preview.png'); } }Here's a multiple files version, based on Ivan Baev's answer.
The HTML
<input type="file" multiple id="gallery-photo-add"> <div class="gallery"></div>JavaScript / jQuery
$(function() { // Multiple images preview in browser var imagesPreview = function(input, placeToInsertImagePreview) { if (input.files) { var filesAmount = input.files.length; for (i = 0; i < filesAmount; i++) { var reader = new FileReader(); reader.onload = function(event) { $($.parseHTML('<img>')).attr('src', event.target.result).appendTo(placeToInsertImagePreview); } reader.readAsDataURL(input.files[i]); } } }; $('#gallery-photo-add').on('change', function() { imagesPreview(this, 'div.gallery'); }); });Requires jQuery 1.8 due to the usage of $.parseHTML, which should help with XSS mitigation.
This will work out of the box, and the only dependancy you need is jQuery.
Yes. It is possible.
Html
<input type="file" accept="image/*" onchange="showMyImage(this)" /> <br/> <img id="thumbnil" style="width:20%; margin-top:10px;" src="" alt="image"/>JS
function showMyImage(fileInput) { var files = fileInput.files; for (var i = 0; i < files.length; i++) { var file = files[i]; var imageType = /image.*/; if (!file.type.match(imageType)) { continue; } var img=document.getElementById("thumbnil"); img.file = file; var reader = new FileReader(); reader.onload = (function(aImg) { return function(e) { aImg.src = e.target.result; }; })(img); reader.readAsDataURL(file); } }You can get Live Demo from here.
TO PREVIEW MULTIPLE FILES using jquery
Clean and simple JSfiddle
This will be useful when you want The event to triggered indirectly from a div or a button.
<img id="image-preview" style="height:100px; width:100px;" src="" > <input style="display:none" id="input-image-hidden" onchange="document.getElementById('image-preview').src = window.URL.createObjectURL(this.files[0])" type="file" accept="image/jpeg, image/png"> <button onclick="HandleBrowseClick('input-image-hidden');" >UPLOAD IMAGE</button> <script type="text/javascript"> function HandleBrowseClick(hidden_input_image) { var fileinputElement = document.getElementById(hidden_input_image); fileinputElement.click(); } </script>1 Comment
Just a note: I can't take credit for this but you can use <label> and avoid javascript for handling the button click altogether. Trigger File-input with pure HTML/CSS., and it's not hacky at all.
2017-10-11T20:27:13.187Z+00:00
Example with multiple images using JavaScript (jQuery) and HTML5
JavaScript (jQuery)
function readURL(input) { for(var i =0; i< input.files.length; i++){ if (input.files[i]) { var reader = new FileReader(); reader.onload = function (e) { var img = $('<img id="dynamic">'); img.attr('src', e.target.result); img.appendTo('#form1'); } reader.readAsDataURL(input.files[i]); } } } $("#imgUpload").change(function(){ readURL(this); }); }Markup (HTML)
<form id="form1" runat="server"> <input type="file" id="imgUpload" multiple/> </form>2,4656 gold badges34 silver badges43 bronze badges
In React, if the file is in your props, you can use:
{props.value instanceof File && ( <img src={URL.createObjectURL(props.value)}/> )}How about creating a function that loads the file and fires a custom event. Then attach a listener to the input. This way we have more flexibility to use the file, not just for previewing images.
/** * @param {domElement} input - The input element * @param {string} typeData - The type of data to be return in the event object. */ function loadFileFromInput(input,typeData) { var reader, fileLoadedEvent, files = input.files; if (files && files[0]) { reader = new FileReader(); reader.onload = function (e) { fileLoadedEvent = new CustomEvent('fileLoaded',{ detail:{ data:reader.result, file:files[0] }, bubbles:true, cancelable:true }); input.dispatchEvent(fileLoadedEvent); } switch(typeData) { case 'arraybuffer': reader.readAsArrayBuffer(files[0]); break; case 'dataurl': reader.readAsDataURL(files[0]); break; case 'binarystring': reader.readAsBinaryString(files[0]); break; case 'text': reader.readAsText(files[0]); break; } } } function fileHandler (e) { var data = e.detail.data, fileInfo = e.detail.file; img.src = data; } var input = document.getElementById('inputId'), img = document.getElementById('imgId'); input.onchange = function (e) { loadFileFromInput(e.target,'dataurl'); }; input.addEventListener('fileLoaded',fileHandler)Probably my code isn't as good as some users but I think you will get the point of it. Here you can see an example
Following is the working code.
<input type='file' onchange="readURL(this);" /> <img id="ShowImage" src="#" />Javascript:
function readURL(input) { if (input.files && input.files[0]) { var reader = new FileReader(); reader.onload = function (e) { $('#ShowImage') .attr('src', e.target.result) .width(150) .height(200); }; reader.readAsDataURL(input.files[0]); } }Try this
To Preview MULTIPLE Files and Single file in single function with reusable approach using Plain JavaScript
What about this solution?
Just add the data attribute "data-type=editable" to an image tag like this:
<img data-type="editable" id="companyLogo" src="http://www.coventrywebgraphicdesign.co.uk/wp-content/uploads/logo-here.jpg" height="300px" width="300px" />And the script to your project off course...
function init() { $("img[data-type=editable]").each(function (i, e) { var _inputFile = $('<input/>') .attr('type', 'file') .attr('hidden', 'hidden') .attr('onchange', 'readImage()') .attr('data-image-placeholder', e.id); $(e.parentElement).append(_inputFile); $(e).on("click", _inputFile, triggerClick); }); } function triggerClick(e) { e.data.click(); } Element.prototype.readImage = function () { var _inputFile = this; if (_inputFile && _inputFile.files && _inputFile.files[0]) { var _fileReader = new FileReader(); _fileReader.onload = function (e) { var _imagePlaceholder = _inputFile.attributes.getNamedItem("data-image-placeholder").value; var _img = $("#" + _imagePlaceholder); _img.attr("src", e.target.result); }; _fileReader.readAsDataURL(_inputFile.files[0]); } }; // // IIFE - Immediately Invoked Function Expression // https://stackoverflow.com/questions/18307078/jquery-best-practises-in-case-of-document-ready ( function (yourcode) { "use strict"; // The global jQuery object is passed as a parameter yourcode(window.jQuery, window, document); }( function ($, window, document) { "use strict"; // The $ is now locally scoped $(function () { // The DOM is ready! init(); }); // The rest of your code goes here! }));Preview multiple images before it is uploaded using jQuery/javascript?
This will preview multiple files as thumbnail images at a time
Html
<input id="ImageMedias" multiple="multiple" name="ImageMedias" type="file" accept=".jfif,.jpg,.jpeg,.png,.gif" class="custom-file-input" value=""> <div id="divImageMediaPreview"></div>Script
$("#ImageMedias").change(function () { if (typeof (FileReader) != "undefined") { var dvPreview = $("#divImageMediaPreview"); dvPreview.html(""); $($(this)[0].files).each(function () { var file = $(this); var reader = new FileReader(); reader.onload = function (e) { var img = $("<img />"); img.attr("style", "width: 150px; height:100px; padding: 10px"); img.attr("src", e.target.result); dvPreview.append(img); } reader.readAsDataURL(file[0]); }); } else { alert("This browser does not support HTML5 FileReader."); } });I hope this will help.
I have made a plugin which can generate the preview effect in IE 7+ thanks to the internet, but has few limitations. I put it into a github page so that its easier to get it
For Multiple image upload (Modification to the @IvanBaev's Solution)
function readURL(input) { if (input.files && input.files[0]) { var i; for (i = 0; i < input.files.length; ++i) { var reader = new FileReader(); reader.onload = function (e) { $('#form1').append('<img src="'+e.target.result+'">'); } reader.readAsDataURL(input.files[i]); } } }http://jsfiddle.net/LvsYc/12330/
Hope this helps someone.
It's my code.Support IE[6-9]、chrome 17+、firefox、Opera 11+、Maxthon3
28.1k15 gold badges67 silver badges79 bronze badges
Default Iamge
@Html.TextBoxFor(x => x.productModels.DefaultImage, new {@type = "file", @class = "form-control", onchange = "openFile(event)", @name = "DefaultImage", @id = "DefaultImage" }) @Html.ValidationMessageFor(model => model.productModels.DefaultImage, "", new { @class = "text-danger" }) <img src="~/img/ApHandler.png" style="height:125px; width:125px" id="DefaultImagePreview"/> </div> <script> var openFile = function (event) { var input = event.target; var reader = new FileReader(); reader.onload = function () { var dataURL = reader.result; var output = document.getElementById('DefaultImagePreview'); output.src = dataURL; }; reader.readAsDataURL(input.files[0]); }; </script>Here's a solution if you're using React:
import * as React from 'react' import { useDropzone } from 'react-dropzone' function imageDropper() { const [imageUrl, setImageUrl] = React.useState() const [imageFile, setImageFile] = React.useState() const onDrop = React.useCallback( acceptedFiles => { const file = acceptedFiles[0] setImageFile(file) // convert file to data: url const reader = new FileReader() reader.addEventListener('load', () => setImageUrl(String(reader.result)), false) reader.readAsDataURL(file) }, [setImageFile, setImageUrl] ) const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop }) return ( <div> <div {...getRootProps()}> {imageFile ? imageFile.name : ''} {isDragActive ? <p>Drop files here...</p> : <p>Select image file...</p>} <input {...getInputProps()} /> </div> {imageUrl && ( <div> Your image: <img src={imageUrl} /> </div> )} </div> ) }https://stackoverflow.com/a/59985954/8784402
ES2017 Way
Here is a much easy way to preview image before upload using pure javascript;
//profile_change is the id of the input field where we choose an image document.getElementById("profile_change").addEventListener("change", function() { //Here we select the first file among the selected files. const file = this.files[0]; /*here i used a label for the input field which is an image and this image will represent the photo selected and profile_label is the id of this label */ const profile_label = document.getElementById("profile_label"); //Here we check if a file is selected if(file) { //Here we bring in the FileReader which reads the file info. const reader = new FileReader(); /*After reader loads we change the src attribute of the label to the url of the new image selected*/ reader.addEventListener("load", function() { dp_label.setAttribute("src", this.result); }) /*Here we are reading the file as a url i.e, we try to get the location of the file to set that as the src of the label which we did above*/ reader.readAsDataURL(file); }else { //Here we simply set the src as default, whatever you want if no file is selected. dp_label.setAttribute("src", "as_you_want") } });And here is the HTML;
<label for="profile_change"> <img title="Change Profile Photo" id="profile_label" src="as_you_want" alt="DP" style="height: 150px; width: 150px; border-radius: 50%;" > </label> <input style="display: none;" id="profile_change" name="DP" type="file" class="detail form-control">Here is easy way to preview image
<input type="file" name="user_profile_image_path" id="user_profile_image_path" /> <img style="height: 150px; width: 150px;" src="" class="img-select profile preview_image"> <script> $('#user_profile_image_path').on('change', function() { const file = this.files[0]; if (!file) return; const reader = new FileReader(); reader.onload = e => $('.preview_image').attr('src', e.target.result).show(); reader.readAsDataURL(file); }); </script>for my app, with encryped GET url parameters, only this worked. I always got a TypeError: $(...) is null. Taken from https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL
HTML
<input type="file" data-previewable="true" data-preview-container=".prd-img-prv" /> <div class = "prd-img-prv"></div>This also handles case when file with invalid type ( ex. pdf ) is choosen
21.5k16 gold badges58 silver badges86 bronze badges
Explore related questions
See similar questions with these tags.













