首页 文章

在上传图像之前预览图像

提问于
浏览
1256

我希望能够在上传之前预览文件(图像) . 应该在浏览器中执行预览操作,而不使用Ajax上传图像 .

我怎样才能做到这一点?

18 回答

  • 5

    对于我的应用程序,加密的GET url参数,只有这个工作 . 我总是得到一个 TypeError: $(...) is null . 取自https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL

    function previewFile() {
      var preview = document.querySelector('img');
      var file    = document.querySelector('input[type=file]').files[0];
      var reader  = new FileReader();
    
      reader.addEventListener("load", function () {
        preview.src = reader.result;
      }, false);
    
      if (file) {
        reader.readAsDataURL(file);
      }
    }
    
    <input type="file" onchange="previewFile()"><br>
    <img src="" height="200" alt="Image preview...">
    
  • 151

    是 . 有可能的 .

    HTML

    <input type="file" accept="image/*"  onchange="showMyImage(this)" />
     
    <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);
            }    
        }
    

    你可以从这里得到Live Demo .

  • 14

    有几种方法可以做到这一点 . 最有效的方法是在<input>File上使用URL.createObjectURL() . 将此URL传递给img.src,告诉浏览器加载提供的图像 .

    这是一个例子:

    <input type="file" accept="image/*" onchange="loadFile(event)">
    <img id="output"/>
    <script>
      var loadFile = function(event) {
        var output = document.getElementById('output');
        output.src = URL.createObjectURL(event.target.files[0]);
      };
    </script>
    

    您还可以使用FileReader.readAsDataURL()来解析<input>中的文件 . 这将在内存中创建一个包含图像的base64表示的字符串 .

    <input type="file" accept="image/*" onchange="loadFile(event)">
    <img id="output"/>
    <script>
      var loadFile = function(event) {
        var reader = new FileReader();
        reader.onload = function(){
          var output = document.getElementById('output');
          output.src = reader.result;
        };
        reader.readAsDataURL(event.target.files[0]);
      };
    </script>
    
  • 2060
    function assignFilePreviews() {
        $('input[data-previewable=\"true\"]').change(function() {
            var prvCnt = $(this).attr('data-preview-container');
            if (prvCnt) {
                if (this.files && this.files[0]) {
                    var reader = new FileReader();
                    reader.onload = function(e) {
                        var img = $('<img>');
                        img.attr('src', e.target.result);
                        img.error(function() {
                            $(prvCnt).html('');
                        });
                        $(prvCnt).html('');
                        img.appendTo(prvCnt);
                    }
                    reader.readAsDataURL(this.files[0]);
                }
            }
        });
    }
    $(document).ready(function() {
        assignFilePreviews();
    });
    

    HTML

    <input type="file" data-previewable="true" data-preview-container=".prd-img-prv" />
    <div class = "prd-img-prv"></div>
    

    当处理具有无效类型(例如pdf)的文件时,这也会处理这种情况

  • 43

    这是一个 multiple files 版本,基于Ivan Baev的回答 .

    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');
        });
    });
    

    由于使用$ .parseHTML,需要jQuery 1.8,这应该有助于XSS缓解 .

    这将是开箱即用的,你需要的唯一依赖是jQuery .

  • 1

    LeassTaTT的答案在FF和Chrome等“标准”浏览器中运行良好 . IE的解决方案存在,但看起来不同 . 这里描述跨浏览器解决方案:

    在HTML中我们需要两个预览元素,img用于标准浏览器,div用于IE

    HTML:

    <img id="preview" 
         src="" 
         alt="" 
         style="display:none; max-width: 160px; max-height: 120px; border: none;"/>
    
    <div id="preview_ie"></div>
    

    在CSS中,我们指定以下IE特定的东西:

    CSS:

    #preview_ie {
      FILTER: progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)
    }
    

    在HTML中,我们包括标准和IE特定的Javascripts:

    <script type="text/javascript">
      {% include "pic_preview.js" %}
    </script>  
    <!--[if gte IE 7]> 
    <script type="text/javascript">
      {% include "pic_preview_ie.js" %}
    </script>
    

    pic_preview.js 是来自LeassTaTT答案的Javascript . 将 $('#blah') 替换为 $('#preview') 并添加 $('#preview').show()

    现在IE特定的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';
    }
    

    那是 . 适用于IE7,IE8,FF和Chrome . 请在IE9中测试并报告 . IE预览的想法在这里找到:http://forums.asp.net/t/1320559.aspx

    http://msdn.microsoft.com/en-us/library/ms532969(v=vs.85).aspx

  • 7

    如何创建一个加载文件并触发自定义事件的函数 . 然后将一个监听器附加到输入 . 这样我们就可以更灵活地使用该文件,而不仅仅是预览图像 .

    /**
     * @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)
    

    可能我的代码不如某些用户好,但我认为你会明白这一点 . 在这里你可以看到example

  • 11

    请看下面的示例代码:

    function readURL(input) {
    
      if (input.files && input.files[0]) {
        var reader = new FileReader();
    
        reader.onload = function(e) {
          $('#blah').attr('src', e.target.result);
        }
    
        reader.readAsDataURL(input.files[0]);
      }
    }
    
    $("#imgInp").change(function() {
      readURL(this);
    });
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <form id="form1" runat="server">
      <input type='file' id="imgInp" />
      <img id="blah" src="#" alt="your image" />
    </form>
    

    此外,你可以try this sample here .

  • 22

    我编辑了@ Ivan的答案,显示“无预览可用”图像,如果它不是图像:

    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');
        }
    }
    
  • 1

    使用JavaScript(jQuery)和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>
    
  • 6

    以下是工作代码 .

    <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]);
            }
        }
    
  • 3

    试试这个

    window.onload = function() {
      if (window.File && window.FileList && window.FileReader) {
        var filesInput = document.getElementById("uploadImage");
        filesInput.addEventListener("change", function(event) {
          var files = event.target.files;
          var output = document.getElementById("result");
          for (var i = 0; i < files.length; i++) {
            var file = files[i];
            if (!file.type.match('image'))
              continue;
            var picReader = new FileReader();
            picReader.addEventListener("load", function(event) {
              var picFile = event.target;
              var div = document.createElement("div");
              div.innerHTML = "<img class='thumbnail' src='" + picFile.result + "'" +
                "title='" + picFile.name + "'/>";
              output.insertBefore(div, null);
            });        
            picReader.readAsDataURL(file);
          }
    
        });
      }
    }
    
    <input type="file" id="uploadImage" name="termek_file" class="file_input" multiple/>
    <div id="result" class="uploadPreview">
    
  • 0

    干净简单JSfiddle

    当您希望从div或按钮间接触发事件时,这将非常有用 .

    <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>
    
  • 0

    这是我的代码 . 支持IE [6-9],chrome 17,firefox,Opera 11,Maxthon3

    HTML

    <input type="file"  id="netBarBig"  onchange="changeFile(this)"  />
    <img  src="" id="imagePreview" style="width:120px;height:80px;" alt=""/>
    

    JavaScript的:

    <script>
       
    function previewImage(fileObj, imgPreviewId) {
        var allowExtention = ".jpg,.bmp,.gif,.png";  //allowed to upload file type
        document.getElementById("hfAllowPicSuffix").value;
        var extention = fileObj.value.substring(fileObj.value.lastIndexOf(".") + 1).toLowerCase();
        var browserVersion = window.navigator.userAgent.toUpperCase();
        if (allowExtention.indexOf(extention) > -1) {
            if (fileObj.files) {
                if (window.FileReader) {
                    var reader = new FileReader();
                    reader.onload = function (e) {
                        document.getElementById(imgPreviewId).setAttribute("src", e.target.result);
                    };
                    reader.readAsDataURL(fileObj.files[0]);
                } else if (browserVersion.indexOf("SAFARI") > -1) {
                    alert("don't support  Safari6.0 below broswer");
                }
            } else if (browserVersion.indexOf("MSIE") > -1) {
                if (browserVersion.indexOf("MSIE 6") > -1) {//ie6
                    document.getElementById(imgPreviewId).setAttribute("src", fileObj.value);
                } else {//ie[7-9]
                    fileObj.select();
                    fileObj.blur(); 
                    var newPreview = document.getElementById(imgPreviewId);
    
                    newPreview.style.border = "solid 1px #eeeeee";
                    newPreview.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale',src='" + document.selection.createRange().text + "')";
                    newPreview.style.display = "block";
    
                }
            } else if (browserVersion.indexOf("FIREFOX") > -1) {//firefox
                var firefoxVersion = parseFloat(browserVersion.toLowerCase().match(/firefox\/([\d.]+)/)[1]);
                if (firefoxVersion < 7) {//firefox7 below
                    document.getElementById(imgPreviewId).setAttribute("src", fileObj.files[0].getAsDataURL());
                } else {//firefox7.0+ 
                    document.getElementById(imgPreviewId).setAttribute("src", window.URL.createObjectURL(fileObj.files[0]));
                }
            } else {
                document.getElementById(imgPreviewId).setAttribute("src", fileObj.value);
            }
        } else {
            alert("only support" + allowExtention + "suffix");
            fileObj.value = ""; //clear Selected file
            if (browserVersion.indexOf("MSIE") > -1) {
                fileObj.select();
                document.selection.clear();
            }
    
        }
    }
    function changeFile(elem) {
        //file object , preview img tag id
        previewImage(elem,'imagePreview')
    }
    
    </script>
    
  • 0

    这个解决方案怎么样?

    只需将数据属性“data-type = editable”添加到图像标记中,如下所示:

    <img data-type="editable" id="companyLogo" src="http://www.coventrywebgraphicdesign.co.uk/wp-content/uploads/logo-here.jpg" height="300px" width="300px" />
    

    当然,你的项目的脚本......

    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!
    }));
    

    See demo at JSFiddle

  • -2

    我已经制作了一个插件,可以通过互联网在IE 7中生成预览效果,但几乎没有限制 . 我把它放入github page以便更容易获得它

    $(function () {
    		$("input[name=file1]").previewimage({
    			div: ".preview",
    			imgwidth: 180,
    			imgheight: 120
    		});
    		$("input[name=file2]").previewimage({
    			div: ".preview2",
    			imgwidth: 90,
    			imgheight: 90
    		});
    	});
    
    .preview > div {
      display: inline-block;
      text-align:center;
    }
    
    .preview2 > div {
      display: inline-block; 
      text-align:center;
    }
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="https://rawgit.com/andrewng330/PreviewImage/master/preview.image.min.js"></script>
    	Preview
    	<div class="preview"></div>
    	Preview2
    	<div class="preview2"></div>
    
    	<form action="#" method="POST" enctype="multipart/form-data">
    		<input type="file" name="file1">
    		<input type="file" name="file2">
    		<input type="submit">
    	</form>
    
  • 2

    单线解决方案:

    以下代码使用对象URL,这比查看大图像的数据URL更有效(数据URL是包含所有文件数据的大字符串,而对象URL,只是引用文件数据的短字符串 - 记忆):

    <img id="blah" alt="your image" width="100" height="100" />
    
    <input type="file" 
        onchange="document.getElementById('blah').src = window.URL.createObjectURL(this.files[0])">
    

    生成的URL将如下:

    blob:http%3A//localhost/7514bc74-65d4-4cf0-a0df-3de016824345
    
  • 250

    对于多图像上传(修改@ IvanBaev的解决方案)

    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/

    希望这有助于某人 .

相关问题