`
shuany
  • 浏览: 253859 次
  • 性别: Icon_minigender_1
  • 来自: 中国
社区版块
存档分类
最新评论

转:FF3(FireFox3),IE8上传图片实现图片预览的方法

阅读更多

最近在项目中遇到一个比较棘手的问题:在较新版本的浏览器(Firefox3、IE8、IE7[IE8模拟])中无法获取file input的完整value,我们先看下测试的结果:

Firefox 2.x、IE6、IE7:在本地及远端都可以取得完整地址(包括路径及文件名)

Firefox 3.0:在本地及远端都不能取得完整地址,只能获得文件名

IE8、IE7[IE8模拟]:在本地可以取得完整地址(包括路径及文件名),在远端不能取得完整地址,只能获得文件名 

我们从上面的测试信息中看到在新版本的浏览器中在远端均没有办法获得完整的地址,那有没有办法可以解决这个问题呢,我们往下看。

如何在Firefox3下取得完整路径?

第一步:打开“about:config”页面,查找“signed.applets.codebase_principal_support”属性,将其值设置为true。

第二步:在javascript中采用以下代码进行获取:

function getValueFF(id){
    var ip = document.getElementById(id);
    if (ip.files) {
        //ffx3 - try to have access to full path
        try {
            netscape.security.PrivilegeManager.enablePrivilege( 'UniversalFileRead' )
        }
        catch (err) {
            //need to set signed.applets.codebase_principal_support to true
        }
    };
    return ip.value;
}



经过以上步骤,在Firefox3下获取file input的value时,会弹出一个Internet Security的对话框,点击"Allow"将可以获取完整value。

如何在IE8下取得完整路径?

方法一:使用selection.createRange

function getValueIE8(id){
    var ip = document.getElementById(id);
    ip.select();
    return document.selection.createRange().text;
}



方法二:引用:https://bugzilla.mozilla.org/attachment.cgi?id=328849

下面是可以运行的代码,大家可以看下测试的结果:


<!doctype html public "-//w3c//dtd html 4.01//en" "http://www.w3.org/tr/html4/strict.dtd">
            <html>
            <head>
            <title>File Input</title>
            <meta http-equiv="content-type" content="text/html; charset=utf-8">
            <style>
            body{font-size:13px;}
            .box{border:1px solid #eee;background:#ffe;padding:10px 30px;margin:10px;}
            dt{font-weight:bold;}
            dt,img,textarea{margin:8px 0;}
            em{color:#f00; font-style:normal;}
            span{color:#999;}
            .ft{color:#999;font-size:11px;text-align:right}
            </style>
            </head>
            <body>
            <h2>在不同浏览器中获取File Input的value</h2>
            <div class="box">
            <input type="file" name="foo" id="foo" size="60" />
            <input type="button" value="Show Value" on

click="alert(document.getElementById('foo').value)" />
            <input type="button" value="Show Value in FF3" onclick="alert(getValueFF('foo'))" />
            <input type="button" value="Show Value in IE8" onclick="alert(getValueIE8('foo'))" />
            </div>
            <div class="box">
            <dl>
            <dt>Firefox 2.x、IE6、IE7</dt>
            <dd>在本地及远端都可以取得完整地址(包括路径及文件名)</dd>
            </dl>
            <dl>
            <dt>Firefox 3.0</dt>
            <dd>在本地及远端都<em>不能</em>取得完整地址,只能获得文件名</dd>
            </dl>
            <dl>
            <dt>IE8、IE7[IE8模拟]</dt>
            <dd>在本地可以取得完整地址(包括路径及文件名),在远端<em>不能</em>取得完整地址,只能获得文件名</dd>
            </dl>
            <span>* 本地:localhost</span>
            </div>
            <div class="box">
            <h3>如何在Firefox3下取得完整路径</h3>
            <p>
            第一步:打开"about:config"页面,查找"signed.applets.codebase_principal_support"属性,将其值设置为true。
            </p>
            <p>
            第二步:在javascript中采用以下代码进行获取:<br />
            <textarea style="width:800px;height:300px;">
            function getValueFF(id){
            var ip = document.getElementById(id);
            if (ip.files) {
            //ffx3 - try to have access to full path
            try {
            netscape.security.PrivilegeManager.enablePrivilege( 'UniversalFileRead' )
            }
            catch (err) {
            //need to set signed.applets.codebase_principal_support to true
            }
            };
            return ip.value;
            }
            </textarea>
            </p>
            <p>
            经过以上步骤,在Firefox3下获取file input的value时,会弹出一个Internet Security的对话框,点击"Allow"将可以获取完整value。<br />
            <span>资料:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=143220" target="_blank">https://bugzilla.mozilla.org/show_bug.cgi?id=143220</a></span>
            </p>
            </div>
            <div class="box">
            <h3>如何在IE8下取得完整路径</h3>
            <p>方法一:使用selection.createRange <br />
            <textarea style="width:800px;height:150px;">
            function getValueIE8(id){
            var ip = document.getElementById(id);
            ip.select();
            return document.selection.createRange().text;
            }
            </textarea>
            </p>
            <p>方法二:引用:<a href="https://bugzilla.mozilla.org/attachment.cgi?id=328849" target="_blank">https://bugzilla.mozilla.org/attachment.cgi?id=328849</a></p>
            </div>
            <script language="JavaScript">
            function getValueFF(id){
            var ip = document.getElementById(id);
            if (ip.files) {
            //ffx3 - try to have access to full path
            try {
            netscape.security.PrivilegeManager.enablePrivilege( 'UniversalFileRead' )
            }
            catch (err) {
            //need to set signed.applets.codebase_principal_support to true
            }
            };
            return ip.value;
            }
            function getValueIE8(id){
            var ip = document.getElementById(id);
            ip.select();
            return document.selection.createRange().text;
            }
            </script>
            </body>
            </html>

在上面我们看到了出现的问题,原因可能是处於对安全性的考量,新版本的浏览器对访问客户端内容设置了较高的权限。虽然现在有变相的 “解决办法”,但都需要用户在访问页面的时候,额外的进行浏览器的安全设置(允许Javascript脚本访问更多的本地内容),否则单靠Javascript还是无法直接进行访问。这就意味这我没有办法像以前那样去直接调用file input的value来进行图片的预览。

那我们是不是有别的什么办法来进行图片的预览呢?继续往下看。

在新版本的浏览器中有提供nsIDOMFile这样一个接口,它提供了三个方法可以使用,分别是:

DOMString getAsBinary();
DOMString getAsDataURL();
DOMString getAsText(in DOMString encoding);

详细的资料看这裡:https://developer.mozilla.org/en/NsIDOMFile

我们这裡就是要使用getAsDataURL()这个方法,这个方法会返回一个data: URL类型的DOMString,它的内容就是文件经过编码后的数据了。

好,下面让我来看下例子吧:

<!doctype html public "-//w3c//dtd html 4.01//en" "http://www.w3.org/tr/html4/strict.dtd">
            <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            <title>New file input tester.</title>
            </head>
            <body>
            <input id="myfile" type="file" />
            <br />
            <img src="" alt="Image to be upload." />
            <div id="info"></div>
            <script type="text/javascript">
            var dFile = document.getElementById('myfile');
            var dImg = document.getElementsByTagName('img')[0];
            var dInfo = document.getElementById('info');
            dFile.onchange = function(){
            if(!dFile.value.match(/.jpg|.gif|.png|.bmp/i)){alert('File type must be: .jpg, .gif, .bmp or .png !');return;}
            if(dFile.files){
            dImg.src = dFile.files[0].getAsDataURL();
            }else if(dFile.value.indexOf('\\') > -1 || dFile.value.indexOf('\/') > -1){
            dImg.src = dFile.value;
            }
            }
            </script>
            </body>
            </html>
分享到:
评论

相关推荐

    上传图片预览-兼容IE6,IE7,IE8,FF

    标题中的“上传图片预览-兼容IE6,IE7,IE8,FF”指的是一个Web开发的技术解决方案,目的是实现图片上传前的预览功能,并确保该功能在早期版本的Internet Explorer(IE6、IE7、IE8)以及Firefox浏览器上都能正常工作...

    JS图片预览(兼容IE6、IE7、IE8和FF)

    在JavaScript(简称JS)中实现图片预览,尤其是在兼容老版本的Internet Explorer(如IE6、IE7、IE8)以及Firefox(FF)等浏览器上,需要考虑多种技术策略和兼容性问题。下面我们将详细讨论如何实现这个功能,并着重...

    兼容ie6、ie7、ie8 和FF的本地上传图片预览

    标题中提到的“兼容ie6、ie7、ie8 和FF的本地上传图片预览”主要涉及以下技术点: 1. **FileReader API**:这是一个HTML5的新特性,用于读取文件。在支持的浏览器中,可以通过`FileReader.readAsDataURL(file)`方法...

    IE和FF的图片上传预览

    本文将详细讲解如何实现IE(Internet Explorer)和FF(Firefox)浏览器的图片上传预览功能,以及处理这两种浏览器在处理文件路径上的差异。 首先,让我们了解一下图片上传预览的基本原理。当用户在网页上选择一个...

    上传并预览图片

    1 上传图片前实现本地预览图片。 2 兼容ie,firefox 3 实现判断文件大小。火狐下实现了上传前判断图片大小,ie下目前是采用ActiveXObject方法,但会弹框提示,不友好,提供ajax方式后台判断文件大小。 4 判断图片类型...

    兼容IE chrome FF 图片上传前预览

    这段代码是用于在图片上传前实现预览功能的,它兼容了Internet Explorer(IE)、Chrome 和 Firefox 这三种主流浏览器。在用户选择图片文件后,可以在网页上显示一个缩放后的预览图,确保预览图像的宽度和高度不超过...

    js预览图片 上传前预览图片 兼容ie6.7.8.9 ff 谷歌 opera 苹果浏览器不兼容

    这个标题提到的"js预览图片 上传前预览图片 兼容ie6.7.8.9 ff 谷歌 opera 苹果浏览器",表明这是一个旨在解决浏览器兼容性问题的解决方案,涵盖了老版本的Internet Explorer(IE6到IE9)以及Firefox、Chrome、Opera...

    js加iframe轻松实现异步图片上传 可以预览 兼容FF,chrome,ie9

    本示例主要探讨如何使用JavaScript结合IFrame技术来实现异步图片上传,并提供预览功能,同时确保兼容Firefox、Chrome和IE9等主流浏览器。 首先,我们需要了解异步上传的基本原理。异步上传,也称为Ajax上传,是指在...

    js上传预览支持FF图片上传预览的ajax上传组件

    在早期,由于浏览器之间的差异,尤其是Firefox与其他主流浏览器如Chrome、Safari和IE的差异,图片预览功能的实现并不简单。例如,Firefox不支持HTML5的FileReader API,这是现代浏览器中实现图片预览的主要方式。 ...

    [php]ifame仿ajax图片上传预览,兼容IE\FF\Chrome

    本项目特别强调了对IE(Internet Explorer)、Firefox(FF)和Chrome的兼容性,这意味着它可能使用了一些特定的代码片段或polyfill来弥补不同浏览器之间的差异。 5. **PHP**:后端语言PHP在这里可能用于接收上传的...

    图片预览(支持IE7)

    不过,值得注意的是,“不兼容FF”表明这种方法只适用于IE7,并不适用于Firefox浏览器。Firefox支持更标准的CSS和JavaScript,所以如果要实现跨浏览器的图片预览,需要采用不同的策略,如使用JavaScript库(如jQuery...

    图片预览(兼容FF,IE7)

    标题中的“图片预览(兼容FF,IE7)”指的是创建了一个功能,允许用户在浏览器上预览图片,这个功能同时支持Firefox(FF)和Internet Explorer 7(IE7)这两种浏览器。在早期的Web开发中,由于不同浏览器对某些技术的...

    JAVA_jsp任意浏览器的图片上传预览

    例如,IE6、IE7、IE8、IE9以及Firefox的不同版本之间就存在显著的区别,这使得单一的前端解决方案难以满足所有情况。 - **IE的复杂性**:IE的不同版本对HTML、JavaScript的支持程度有别,尤其是早期版本的IE(如IE6...

    图片上传预览

    本文将深入探讨如何实现“图片上传预览”,并重点关注对不同浏览器(包括IE 6、IE 7、IE 8、Firefox、Chrome和Opera)的兼容性处理。 首先,我们需要了解HTML5中的File API,它提供了一种在浏览器中读取和操作文件...

    不支持FF. 支持IE 预览效果

    支持IE”指的是该技术或功能在Firefox浏览器(FF)上可能无法正常工作,但可以在Internet Explorer(IE)浏览器上运行。这通常涉及到浏览器兼容性问题,是Web开发中常见的一类问题。由于Firefox和IE使用了不同的...

    支持FF图片上传预览的ajax上传组件

    图片上传预览,图片上传组件,我从前天找到今天,总算找到一个,能支持FF加IE的东东,从IE7,想预览上传的图片,可真不是件容易的事,6分值啊,还支持多传

    兼容IE(678)FF缩略图的使用方法.doc

    然而,在不同的浏览器中,实现缩略图的方法却有所不同,本文将介绍如何在IE(6、7、8)和FireFox(FF)浏览器中实现缩略图的使用方法。 缩略图的使用方法 在实现缩略图功能时,需要使用HTML、CSS和JavaScript技术...

    上传图片并实时显示

    在“上传预览(兼容IE ff)”这个子文件名中,我们可以推测这个压缩包可能包含了兼容旧版浏览器(如Internet Explorer和Firefox)的解决方案。在旧版浏览器中,File API的支持可能不完全,因此可能需要使用...

Global site tag (gtag.js) - Google Analytics