【问题标题】:How to upload preview image before upload through JavaScript如何通过 JavaScript 在上传前上传预览图像
【发布时间】:2011-05-04 21:17:49
【问题描述】:

我想在将图像上传到服务器之前对其进行预览。我已经为它编写了一些代码,但由于某种安全原因,它只能在 Internet Explorer 中预览,而不是在 Safari、Chrome、Firefox 等其他浏览器中预览。有没有办法在这些浏览器中预览图片?

    <body>
       <form name="Upload" enctype="multipart/form-data" method="post">
           Filename: <INPUT type="file" id="submit">
           <INPUT type="button" id="send" value="Upload">
       </form>
       <div 
           id="div" 
           align="center" 
           style="height: 200px;width: 500px;border-style: ridge;border-color: red">
       </div>
    </body>

    <script type="text/javascript">
        var img_id=0
        var image = new Array()
        document.getElementById('send').onclick=function()
        {
            img_id++
            var id="imgid"+img_id
            image = document.getElementById('submit').value;
            document.getElementById('div').innerHTML="<img id='"+id+"' src='"+image+"' width=500px height=200px>"
        }
    </script>
</html>

【问题讨论】:

    标签: javascript


    【解决方案1】:

    对于火狐。由于安全性,它有一条截断的路径。但是,他们提供了其他方法:

    var img = document.createElement("IMG");
    if(document.all)
        img.src = document.getElementById('submit').value;
    else
        // Your solution for Firefox.
        img.src = document.getElementById('submit').files.item(0).getAsDataURL();
    document.getElementById('div').appendChild(img);
    

    以下内容适用于 Internet Explorer 7 和 Firefox 3。

    <style type="text/css">
        #prevImage {
            border: 8px solid #ccc;
            width: 300px;
            height: 200px;
        }
    </style>
    <script type="text/javascript">
        function setImage(file) {
            if(document.all)
                document.getElementById('prevImage').src = file.value;
            else
                document.getElementById('prevImage').src = file.files.item(0).getAsDataURL();
            if(document.getElementById('prevImage').src.length > 0) 
                document.getElementById('prevImage').style.display = 'block';
        }
    </script>
    <pre>
         IE8 needs a security settings change: internet settings, security, custom level :
    
         [] Include local directory path when uploading files to a server
     ( ) Disable
     (o) Enable 
    </pre>
    <form>
        <input type="file" name="myImage" onchange="setImage(this);" />
    </form>
    <img id="prevImage" style="display:none;" />
    

    Documentation of File List object on MDC

    【讨论】:

    • 我没有在 Chrome 中检查它。会在几分钟内回复您。
    • @Zain 你有哪个版本的 Chrome。
    • @Zain chrome 似乎比 FF 更安全 :) Chrome 支持“文件”具有大小、文件名、名称等属性,但没有“getAsDataURL()”。我已经研究过其他选项,但似乎我们对 Chrome 没有这样的好选项。我会在 chrome 开发组上发布这个,看看他们得到了什么。
    • 真的非常感谢 Ramiz.. :)
    • @user648372 我已经更新了我的帖子。检查 标签。您必须更改一些安全设置才能使其正常工作。
    【解决方案2】:

    uploadFile(event: any) {
        const image: any = document.getElementById('output');
        image.src = URL.createObjectURL(event.target.files[0]);
    }
    <div>
        <img id="output" width="200" />
    </div>
    <div class="form-group">
        <label for="exampleFormControlFile1">File Input</label>
        <input type="file" (change)="uploadFile($event)" class="form-control-file" />
    </div>

    【讨论】:

    • 我已经应用了这个我的 angular 9 项目并且它完美地工作。
    【解决方案3】:

    这对我来说在 FF 3.6、IE 8、Safari 4.0 和 Chrome 3.195 中运行良好。

    一些样式指针:

    • 不要使用固定宽度的预览区域,您的图片会变形以适应该区域
    • 用这个代替document.getElementById()

      function $(id) { return document.getElementById(id); }

    • 示例:$('send')

    【讨论】:

    • Steve..请你给我解释一下(function $(id) { return document.getElementById(id); }) ..一点点..会很感激的
    • @Zain 他提供了一种使用document.getElementById() 的简写方式。它很冗长,所以$() 快捷方式很有帮助。
    • 使用 '$' 可能会与广泛使用的库 jquery 混淆。
    【解决方案4】:

    无法在上传前获取用户文件,除非使用新的 File API:

    Example: Showing thumbnails of user-selected images

    当然,这不会是跨浏览器的。也可能有一种方法可以通过 Flash 和数据 URL(或仅在 Flash 中预览)来实现,但我更喜欢避免 JavaScript Flash 集成。

    【讨论】:

    • 谢谢 Pradeep 和 theazureshadow,但是,我很难相信我们无法在浏览器中打开图像(FF,基于 Webkit)。请查看来自“Mugtug”的名为 Darkroom (mugtug.com/darkroom) 的 Web 应用程序。这个网络应用程序允许用户加载图像以进行进一步操作(网络应用程序左上方的打开图标),我希望实现单击时弹出对话框的相同功能,以便用户可以选择要显示的图像.有什么想法吗?
    • 就像我说的,你可以用 html5 做到这一点。这就是 Mugtug 的做法:Mugtug Darkroom is a Browser-Based Photo Editor Powered Entirely by HTML5
    【解决方案5】:

    看看下面与文件 API 相关的链接,它适用于 IE9+ 我检查它不适用于 IE8 它显示了如何预览图像和文本文件 http://www.xul.fr/en/html5/filereader.php FileReader,在网页中加载图片

    FileReader 允许访问本地文件系统并仅使用 JavaScript 代码加载文档。

    这样就完成了选择本地文件,因为这个标签只能将这个文件的内容提供给服务器上的一个脚本,连同表单数据。

    兼容性测试

    当前浏览器识别它是 File API,其中包括 FileReader 对象?

    结果 支持文件 API。 测试源代码:

    <script>
    if (window.File && window.FileReader && window.FileList && window.Blob) 
      document.write("<b>File API supported.</b>");
    else
      document.write('<i>File API not supported by this browser.</i>');
    </script>   
    

    HTML 代码:

    <input type="file" id="getimage">
    
    <fieldset><legend>Your image here</legend>
        <div  id="imgstore"></div>
    </fieldset> 
    

    JavaScript 代码:

    <script>
    function imageHandler(e2) 
    { 
      var store = document.getElementById('imgstore');
      store.innerHTML='<img src="' + e2.target.result +'">';
    }
    
    function loadimage(e1)
    {
      var filename = e1.target.files[0]; 
      var fr = new FileReader();
      fr.onload = imageHandler;  
      fr.readAsDataURL(filename); 
    }
    
    window.onload=function()
    {
      var x = document.getElementById("filebrowsed");
      x.addEventListener('change', readfile, false);
      var y = document.getElementById("getimage");
      y.addEventListener('change', loadimage, false);
    }
    </script>
    

    【讨论】:

      【解决方案6】:

      如果输入类型是文件,那么使用htmlfilereader函数我们可以看到html页面的预览吗?使用接受类型="text/html"

      我得到了文件描述和大小...

      <script>
        function handleFileSelect(evt) {
          var files = evt.target.files; // FileList object
      
          // files is a FileList of File objects. List some properties.
          var output = [];
          for (var i = 0, f; f = files[i]; i++) {
            output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
                        f.size, ' bytes, last modified: ',
                        f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                        '</li>');
          }
          document.getElementById('list').innerHTML = '<ul>' + output.join('') + '</ul>';
        }
      
        document.getElementById('files').addEventListener('change', handleFileSelect, false);
      </script>
      

      上述问题与离线本地存储的html页面有关。我们可以看到使用 live url as-的 live page 的预览-

      <html>
          <head>
          <!--[if IE]>
          <style>
          #frame {
              zoom: 0.2;
          }
          </style>
          <![endif]-->
          <style>
          #frame {
              width: 800px;
              height: 520px;
              border: none;
              -moz-transform: scale(0.2);
              -moz-transform-origin: 0 0;
              -o-transform: scale(0.2);
              -o-transform-origin: 0 0;
              -webkit-transform: scale(0.2);
              -webkit-transform-origin: 0 0;
          }
          </style>
          </head>
          <body>
          <iframe id="frame" src="http://www.bing.com">
          </iframe>
          </body>
          </html
      

      >

      【讨论】:

        【解决方案7】:

        使用这个很简单

        在您的 HTML 文件中使用

        <div>
        <form id="form1" runat="server">
                <input type='file' id="imgInp" />
                <br>
                <img id="blah" src="http://i.imgur.com/zAyt4lX.jpg" alt="your image" height="100" />
            </form>
        <div>
        

        然后在你的 java 脚本文件中写这个

        <script>
        
         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>
        

        【讨论】:

          【解决方案8】:

          这在 FF 3.6、IE 9、Safari 4.0 和 Chrome 3.195 中运行良好。

          var reader = new FileReader();
          
          function preview(what) {
               if(jQuery.browser.msie || jQuery.browser.safari || jQuery.browser.chrome) {
                   document.getElementById("preview-photo").src=what.value;
                   return;
              }
              else{                   
                  // array with acceptable file types
                  var accept = ["image/png","image/jpeg","image/jpg","image/gif"];
          
                  // if we accept the first selected file type
                  if (accept.indexOf(what.files[0].type) > -1) {
                      if(what.files && what.files[0]){
                            reader.readAsDataURL(what.files[0]);
                            document.getElementById("preview-photo").src=reader.result;
                      }
                  }       
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-09-21
            • 1970-01-01
            • 1970-01-01
            • 2013-04-18
            • 2011-05-26
            相关资源
            最近更新 更多