图片上传 - 在点击提交之前在网页上显示图片

Posted

技术标签:

【中文标题】图片上传 - 在点击提交之前在网页上显示图片【英文标题】:Image Upload -- showing image on web page before hitting Submit 【发布时间】:2010-12-21 11:18:58 【问题描述】:

为了更好地学习 Web 开发,我正在尝试编写一个 php 页面,它可以让我从服务器上传和下载文件,这是我以前在 ASP 中完成的。

然而,我被一些理由认为应该很简单的事情绊倒,但我无法找到答案。

这是浏览/提交的标准代码:

<form enctype="multipart/form-data" action="uploadFile.php" method="POST"/>  
<input type="hidden" name="MAX_FILE_SIZE" value="500000" />  
<input type="file" name="pix" size="100" />  
</form>

现在,当您点击生成的网页上的“浏览..”按钮时,您会看到标准文件对话框,然后返回到文本框中包含正确文件路径的页面。 (并且,当我单击提交时,我的 uploadfile.php 工作正常。)

我想要做的实际上是向用户(好吧,我)展示网页上的图片,如果它是适合 IMG 的文件,或者是非图像文件的占位符图片 - 在用户点击之前提交按钮。

注意客户端文件的正确路径名在页面上是正确的。我一生都无法弄清楚如何从 DOM 中捕获它,或者就此而言,弄清楚如何让 javascript 注意到 return-with-correct-pathname 以触发显示图片。

(对于这个问题的广泛性,我深表歉意——我确实在这里尝试了很多搜索以前的问题和答案,但是当我可能不仅缺乏技术术语而且缺乏概念时,很难提出一个问题.)

【问题讨论】:

【参考方案1】:

您可以使用 Ajax 在后台提交表单并将图像文件保存到临时目录。然后,尝试通过更改img 元素的src 属性在页面上显示它。当用户最终单击提交时,将图像复制到其最终目的地。如果他取消或浏览离开 - 删除文件。

【讨论】:

两个次要的 cmets - 1) 您必须将表单提交到(隐藏的)iframe 才能上传文件。 2) 对于大图像,上传过程可能需要很长时间,因此您需要进度指示器。 好的cmets。我相信新的 html 5 对此提供了更好的解决方案(有关实际示例,请参见此页面:developer.mozilla.org/en/Using_files_from_web_applications),但它仅受 FF 3.6 beta 和 Chrome 4 beta 及更高版本的支持。【参考方案2】:

想想你的要求。如果网页可以从您(而不是服务器的)文件系统中加载任意文件,那么如何阻止它将您的私人数据发送到任何恶意网站?

【讨论】:

【参考方案3】:

您只能使用 Flash 执行此操作。

谷歌类似"flash image upload with preview"

【讨论】:

您可以在没有 Flash 的情况下执行此操作。所以它不是“仅使用 Flash”。 您也可以使用 Java 或 Silverlight @X-Istence:Traveling Tech Guy 已经发布了我会发布的想法。【参考方案4】:

您可以使用 Firefox 和其他支持 FileList API 的浏览器来执行此操作。

var myImage = new Image(),
myImage.src = myFileInput.files[0].getAsDataURL();

编辑:不应在客户端指定最大文件大小,因为它可以被利用,但您至少可以在客户端使用 files[0].getAsBinary().length 验证它。

【讨论】:

这个函数在firefox中有效!很好的答案!只是好奇哪些浏览器不支持它? @m.u.sheikh:嗯,大的可能是 Internet Explorer。不过,这只是一个猜测。【参考方案5】:

您的问题确实没有单一的解决方案。但在网络的当前状态下,最好的方法是 Flash。 See this post for a how-to。 Flash 是一种专有解决方案,但已在 98% 以上的计算机上实施,因此很安全。只需确保按照渐进式增强/优雅降级方法实现它即可。

您可以通过 java 小程序来实现,它广泛可用且非专有,但这对我来说似乎有点矫枉过正(但我不是 java 开发人员)。

银光?好吧,和大多数用户说再见。据我所知,它远未普及。所以人们必须安装一个插件才能看到你的用户界面。不过,在某些情况下可能没问题(内联网、您可以自己手动设置的一组固定机器等)。

基于 ajax 的解决方案具有不基于专有技术的优势,但这意味着将文件上传到服务器,因此在您的情况下它不是一个解决方案,因为对于大图像,它需要很长时间,并且感觉不像是预览版了,对吧?

【讨论】:

对于除 IE9 和更早版本之外的所有浏览器,无需向服务器发送任何数据即可完成此操作。如果 IE9 和更早版本需要预览,如您所说,您需要使用 Flash,或者先将文件发送到服务器。【参考方案6】:

如果您正在寻找非 IE(包括 IE 9)解决方案,这可能就是解决方案。 (当然有微调) http://www.html5rocks.com/en/tutorials/file/dndfiles/

否则,您必须上传并从服务器获取路径才能显示缩略图或预览。还有其他一些方法,如 flash / java / silverlight,适用于大多数浏览器,但它仍然不是一个纯粹的 Web 解决方案。

【讨论】:

以上是关于图片上传 - 在点击提交之前在网页上显示图片的主要内容,如果未能解决你的问题,请参考以下文章

上传图片时文件过大怎么办?

上传的图片不显示在网页上

发送ajax请求实现上传图片显示在网页上

编辑网页,上传后,无法显示图片,怎么办?

我要在一个网页上传一张图片到服务器,然后保存图片的地址,在另一个页面显示图片

vue, vux调用微信点击图片,上传图片,删除图片,接口,其中选图接口,苹果手机显示有问题,查看不到图片,提交会提示fail not exist,解决如下