Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以在通过表单上载本地图像之前预览它们?_Javascript_Image_Upload_Preview - Fatal编程技术网

Javascript 是否可以在通过表单上载本地图像之前预览它们?

Javascript 是否可以在通过表单上载本地图像之前预览它们?,javascript,image,upload,preview,Javascript,Image,Upload,Preview,更具体地说,我想使用一个表单,其中包含一个或多个用于图像的文件输入字段。当这些字段发生更改时,我希望在将数据发送到服务器之前显示关联图像的预览 我尝试了许多javascript方法,但总是遇到安全错误。 我不介意使用java或flash,只要该解决方案能够为那些没有java或flash的用户优雅地降级。(他们不会得到预览,也不会得到恼人的“安装这个东西”。) 有没有人用一种简单的、可重复使用的方式来做这件事 另外,我知道有一个沙箱,但是沙箱必须在一个黑暗、锁着的房间里,所有的窗户都被遮住吗?用于

更具体地说,我想使用一个表单,其中包含一个或多个用于图像的文件输入字段。当这些字段发生更改时,我希望在将数据发送到服务器之前显示关联图像的预览

我尝试了许多javascript方法,但总是遇到安全错误。 我不介意使用java或flash,只要该解决方案能够为那些没有java或flash的用户优雅地降级。(他们不会得到预览,也不会得到恼人的“安装这个东西”。)

有没有人用一种简单的、可重复使用的方式来做这件事


另外,我知道有一个沙箱,但是沙箱必须在一个黑暗、锁着的房间里,所有的窗户都被遮住吗?

用于上传图像和预览图像。

出于安全目的,JavaScript无法访问本地文件系统,句号。

第一步是找到图像路径。JavaScript允许查询上传控件的文件名/路径,但是(出于安全原因)不同的浏览器向JS引擎显示的内容与向用户显示的不同-它们倾向于保持文件名的完整性,以便您至少可以验证其扩展名,但您可能会在文件名前面添加
c:\fake\u path\
或类似的模糊内容。在各种浏览器上尝试这一点可以让您了解什么是返回的真实路径,什么是伪造的,以及在哪里


第二步是显示图像。如果用户的浏览器允许使用
文件://
方案,则可以通过
img
标记和
file://
源URL显示本地图像(如果您知道它们的路径)。(默认情况下,Firefox不会。)因此,如果你可以让用户告诉你图像的完整路径,你至少可以尝试加载它。

我只见过这样做的Java小程序,例如Facebook上的图像上传小程序。Java方法的缺点是,在小程序运行之前,会提示用户信任它,这是一种麻烦,但这允许小程序向文件浏览器提供图像预览,或者做一些更有趣的事情,例如允许用户上载整个目录。

不需要花哨的东西。您所需要的只是
createObjectURL
函数,它可以创建一个URL,该URL可以用作图像
src
,并且可以直接来自本地文件

假设您使用文件输入元素(
)从用户的计算机中选择了两个图像。以下是如何为其创建图像文件预览:

function createObjectURL(object) {
    return (window.URL) ? window.URL.createObjectURL(object) : window.webkitURL.createObjectURL(object);
}

function revokeObjectURL(url) {
    return (window.URL) ? window.URL.revokeObjectURL(url) : window.webkitURL.revokeObjectURL(url);
}

function myUploadOnChangeFunction() {
    if(this.files.length) {
        for(var i in this.files) {
            var src = createObjectURL(this.files[i]);
            var image = new Image();
            image.src = src;
            // Do whatever you want with your image, it's just like any other image
            // but it displays directly from the user machine, not the server!
        }
    }
}

您可以尝试这种方法,尽管它似乎不适用于IE

编写代码既简单又快速

我将代码放在这里,以防源代码死亡:

脚本:

    <!-- Assume jQuery is loaded -->
    <script>
      function readURL(input) {
        if (input.files && input.files[0]) {
          var reader = new FileReader();

          reader.onload = function (e) {
            $('#img_prev')
              .attr('src', e.target.result)
              .width(150)
              .height(200);
          };

          reader.readAsDataURL(input.files[0]);
        }
      }
    </script>

函数readURL(输入){
if(input.files&&input.files[0]){
var reader=new FileReader();
reader.onload=函数(e){
$('img#u prev')
.attr('src',e.target.result)
.宽度(150)
.身高(200);
};
reader.readAsDataURL(input.files[0]);
}
}
在HTML中:

    <!--[if IE]>
      <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
    </head>
    <body>
      <input type='file' onchange="readURL(this);" />
      <img id="img_prev" src="#" alt="your image" />
    </body>


此功能在显示图像之前上载图像。整洁的代码,虽然你不能预览你的图像之前不上传它。我不知道用Flash可以做到这一点,可能是用Java,但我认为这就像用锤子打死苍蝇一样。你可以用iframes做一些“Ajax模拟”上传,网上有一些例子,它们工作得很好。检查一下这个纯JavaScript方法的可能重复,包括它的答案和Ray Nicholus对最终解决方案的评论:这是安全性白痴。这样的文件无法发送到服务器,那么这是为了什么?我见过很多网络游戏可以将图形下载到硬盘上,所以游戏运行得更快。思考者,这通常是通过HTTP缓存实现的——这是完全不同的事情。JS仍然无法访问客户端文件系统上的路径。除了现在有一个HTML5文件API,它允许您读取上传的文件。它是安全的,但只在Chrome18、Chrome18和Firefox11中有效。我没有在Safari工作(我和9岁的孩子没有在opera登记)。我将在稍后进行研究,看看是否可以在saf&ie中使用它。无论如何,它很有趣…:)这是完成该任务最合适的方式。根据这一点:它已经在IE 10和Opera中工作了。唯一的问题是,不要对数组使用
for(vari in something)