您现在如何上传图片?
您选择一个文件,然后点击上传。 很简单吧? 除了您选择图片后,就无法再看到所选内容。 文件名位于输入框的末尾,如果输入框很短,或者文件路径很深,您将看不到任何有用的信息。 您会忘记选择了什么,也不知道要上传什么。 “等等,我上传的是我自己的照片,还是其他不太专业的东西?”

让我们把它做得更好。
关键是提供一个图片预览,在用户需要提交保存之前显示。 因此,我们将放弃上传按钮,转而使用保存按钮。 现在,当用户通过文件选择输入框选择文件时,将启动一些 AJAX 操作。 图片将在服务器端处理,并在现有页面上加载缩略图。

感觉好多了吧? 我们现在对所选图片有一个视觉表示(想象一下)。
这在更大的表单中特别有用,因为多个字段将通过单个操作提交。 它允许用户在按下保存按钮之前查看表单,并查看他们选择了哪些图片(或图片)。
如何实现
好奇如何实现吗? 这是代码。
我们可以使用标准的 HTML 表单。 我们将包含该表单以及图片预览区域。
<div id="upload-area">
<div id="preview">
<img width="100px" height="100px" src="/images/icons/128px/zurb.png" id="thumb">
</div>
<form action="/playground/ajax_upload" id="newHotnessForm">
<label>Upload a Picture of Yourself</label>
<input type="file" size="20" id="imageUpload" class=" ">
<button class="button" type="submit">Save</button>
</form>
</div>
表单的操作应指向某个地方,无论是否存在 JavaScript,都可以处理图片上传。 您可能还需要考虑仅通过 JavaScript 追加预览标记,因为没有 JS 就无法实现。
您将需要 jQuery 和 Andrew Valums 的 AJAX Upload jQuery 插件。 将它们链接起来,确保 jQuery 首先加载。 请注意,AJAX Upload 插件需要一些配置和服务器端内容才能工作。 查看该链接以获取详细信息。
<script src="/js/jquery.min.js" type="text/javascript"></script>
<script src="/js/ajaxupload.js" type="text/javascript"></script>
以下是我们将添加的完整 JavaScript 代码。
$(document).ready(function(){
var thumb = $('#thumb');
new AjaxUpload('imageUpload', {
action: $('#newHotnessForm').attr('action'),
name: 'image',
onSubmit: function(file, extension) {
$('#preview').addClass('loading');
},
onComplete: function(file, response) {
thumb.load(function(){
$('#preview').removeClass('loading');
thumb.unbind();
});
thumb.attr('src', response);
}
});
});
以下是用通俗易懂的语言解释的代码
- 将插件行为附加到文件输入框
- 指定操作 URL,从标记中的操作 URL 中提取它
- 当选择文件时,立即在预览区域添加一个名为 “loading” 的类。 通过 CSS,此类名将隐藏图片(例如.loading img { display: none; }并应用背景图片 (一个旋转器)
- 在 AJAX 成功后,删除loading类,并将src属性设置为插件返回的响应 URL。
仅预览
请注意,以上代码仅处理预览功能。 文件选择输入框仍包含正确的文件路径。 因此,当用户点击 “保存” 按钮时,表单仍然需要由您为其准备的任何服务器端技术处理。 所以,您实际上将上传一次图片(用于预览),然后再次上传(以更永久的方式保存它)。
在设置/配置插件时,您将设置一个目录,用于保存上传的图片的服务器端脚本。 您可能希望将该目录放在类似于/images/temp/的位置。 这样,您就知道上传到该目录的任何内容都是临时的,可以临时清理,以保持服务器清洁。 定期清理该目录的 CRON 作业可能是个好主意。
演示
ZURB 网站上有一个可用的工作演示,其中还包含更多文字信息。 由于需要进行服务器端操作,因此遗憾的是,下载并不实用。
想知道其他关于 CSS3 和 JavaScript 的优秀技巧吗? 查看 ZURB Playground。
ZURB 是一支紧密团结的互动设计师和策略师团队,他们帮助公司设计更好的产品和服务。 自 1998 年以来,ZURB 已帮助超过 75 家客户,包括:Facebook、eBay、纽约证交所、雅虎、Zazzle、Playlist、布兰妮·斯皮尔斯等。
感谢您的提示!
您能推荐一些简单的 AJAX 上传文件进度条脚本吗? 似乎很难找到。
谢谢!
AJAX 上传进度条很难找到,因为这取决于您使用的服务器端语言。 如果是 PHP,请查看 pecl APC。
另外,还有一些 Flash SWF 上传器,但我不喜欢 Flash,所以我不建议使用它们;)
您可以搜索 html5 上传进度,您会找到它
我知道这可能看起来有点偷懒,但您不能只创建一个老式的动画 GIF 文件,然后使用 AJAX 添加类 “loading”(就像 Chris 的代码一样),该类可以有一个 CSS 属性来调用加载动画 GIF 文件,直到该类被删除。 这样虽然不能提供任何精确的加载信息,但至少可以表明正在发生一些事情。
是的,但我会建议创建一个类似于 GIF 的小型 Flash 动画。 在测试中,IE 冻结了 GIF 动画。
我建议使用任何基于 Flash 的上传器,因为这会让您的生活更轻松。 我推荐以下两个
jqUploader
SWFUpload jQuery 插件
这些上传器的优点是它们都拥有不错的 jQuery API :)
感谢您重新制作了这个动态脚本,它让我们的开发人员生活更轻松,更不用说让那些不太懂技术的客户印象深刻了。
我喜欢 “黑衣人” 的引用。
很棒的脚本!
非常棒,但这种方法有一个小问题。
如果用户不小心选择了错误的文件/图片怎么办? 通常情况下,您可以更改它,但现在,它会自动上传。
如果用户在图片完全上传之前就提交了表单,就会出现问题。 在演示中试试: 选择一张图片,然后选择另一张图片,以此类推。 所有图片都会排队,并在彼此处理后依次加载/显示。
如果用户在 “最终图片” 处理之前就 “提交” 了表单,将使用哪张图片作为头像?
除此之外,这是一个很棒的可用性示例:)
这是我注意到的第一件事。 我选择了一张非常大的图片,3MB……它上传得非常慢,我意识到我已经有一张更小的版本。 我找到的唯一解决方案是刷新页面,重新开始。
绝对需要一个 “取消” 按钮。
为了进一步说明 Marco 的观点,解决方案是一个更大难题的一部分。 尽管这是一个很棒的前端解决方案,但它未能解决如何在服务器端处理这个问题。
您可以假设 “保存” 按钮的作用以及它可能触发的某些数据库查询,但您还需要考虑如果上传了多个文件,将保留哪些图片在服务器上,或者如果您打算只保存一张图片,如何删除它们。
也许这篇文章的第二部分会涉及这些内容:)
AJAX Upload 插件会将文件保存到一个目录中,正如我在文章中提到的,最好将它们保存到 TEMP 目录中。 点击保存按钮将保存它,可能保存到一个更永久的目录中。 表单实际上传的是输入框中当前的文件路径。
我认为这里并没有说得那么复杂。
我同意,解决删除问题并不难。
一旦用户保存了图片,您可以保留文件名,以及预览/缩略图(如果您喜欢),然后添加一个删除单选按钮(或其他任何按钮),用于该照片。
这在我的 网站 上一直困扰着我,我还没能解决它,但这个演示很有帮助。
Tim
我在一个网站上使用了它,但在 Chrome 中会显示 “未选择文件”,即使我选择了一个文件。 这个问题解决了吗?
嗨,Fiaz - 感谢你的询问。这个插件可以正常工作,只是Chrome中显示的这个消息有点令人困惑。这是一个与Chrome相关的问题。我们会看看我们能做些什么来改善它。
感谢你的参与!你对我们其他ZURBplayground技术有什么看法?
-Dmitry
我一直都在寻找Ajax图片上传器,甚至还查看了ZURB网站,但我更具体地想要一个带缩放裁剪功能的上传器 - (网上似乎没有这样的代码)
对于网络上的普通用户(也许就是我?)来说,不清楚图片在预览时是否已保存,你可以在页面上看到图片,所以会认为它已经上传了?
不幸的是,它不适用于Opera 10.53。
如果我没记错的话,它之前在Zurb上也是有的,我想我之前见过。
为什么不这样做:当用户选择图片时,图片位置将被放置在预览的“img”标签中,例如
<img src="file://c:/SomeImage.png" />
如果用户喜欢它,就可以上传。
我很喜欢这个想法。我认为我从未见过它以这种方式实现。我想知道是否有一些障碍阻止了它(例如浏览器在提供文件路径方面的不一致性),或者只是人们还没有聪明到尝试它......
我太喜欢这个想法了!!!
我今天下班后将在几个不同的浏览器中进行测试。
这是一个天才般的简单想法!期待知道它是否有效。
我不明白为什么这行不通,我在读这篇文章的时候也想到了这一点。它也会非常响应式,速度更快。
我唯一能预见的问题是安全页面和Internet Explorer关于混合安全和非安全项的警告。
刚刚找到了这个:http://www.experts-exchange.com/Programming/Languages/Scripting/JavaScript/Q_26302820.html,看来似乎不可能。
我一直在做一些关于这方面的研究,情况不太好。Firefox有一个解决方法,它允许你访问一个函数,以数据 URI 的形式获取图像数据。IE 和 Opera 会给你一个奇怪的 /fakepath/ 值,而 Safari/Chrome 则不会给你任何文件输入的值。
好吧,我很高兴有人说出来了,因为,整个概念在我看来毫无用处。为什么浪费所有这些客户端和服务器端的资源,当你可以直接将浏览器指向本地文件时?*挠头*
是的,我刚滚动到页面底部,正想在评论中说同样的话。
在Mac上的Firefox 2的HTTP环境中测试。(不是在PC上,也不是使用HTTPS,不知道这是否会成为问题)。
呵呵,这个评论让整篇文章变得毫无意义。
一个Mootools的替代方案,也支持FF的拖放功能:http://mootools.standupweb.net/dragndrop.php
一个小问题/更像是一个疑问...这种方法不支持iPad或iPhone选择照片上传...我最初的想法是在“最新进展”中添加一个输入字段,允许复制和粘贴文件名,但这并不能以用户友好的方式解决问题(他们需要将照片通过邮件发送给自己,然后通过转发邮件来获取文件名访问...有人有更优雅的解决方案吗?
使用隐藏iframe方法上传文件的方法不是更好吗?
你仍然可以预览图片,但是,使用一些服务器端脚本,你可以在提交表单时保留这个文件,而无需再次等待文件上传(服务器端脚本也需要在表单正常上传文件时回退)。
预览上传(返回图片的URL)可以在提交时使用。让它也发送一些哈希码。
如果用户自从上次成功的预览调用后没有再次浏览,则发送预览的哈希码,以便服务器不会再次下载它,而是简单地将早期文件从临时目录移动到永久位置。
如果我从头开始构建它,我也会尝试这样做。如果文件已经通过AJAX上传了一次,点击保存应该只触发一个操作,将该文件移动到永久位置,然后就完成了。
关于“清理问题”:创建一个包含临时文件名和上传时间戳的数据库。上传完成后,将临时文件和时间戳写入数据库。提交时,从数据库中删除它。使用一个每天/每周运行的cron脚本,查询前一天/周的上传记录,并删除这些文件。这些将是所有上传但从未提交的图片。非常非常简单的脚本/数据库,非常有效。
这些都是好信息!我特别喜欢MIB的引用。
K
提交表单后,可以使用PHP或其他服务器端语言删除临时预览文件。
嗯;)这篇文章拯救了我的生命,很棒的东西,特别是它使用Ajax完成的。继续努力,保持联系!
这是我实现它的方式。我的网站上有四个图片上传框,每个框被点击时都会自动上传一张图片。
我的表单根本没有文件输入,我将ajax上传应用于一个上传图标,图片上传后,我有一个php脚本创建一个缩放裁剪后的完整版本,以及一个100×100的缩略图,放在一个临时文件夹中。缩略图路径将返回到响应变量中,我使用它来更新表单中的缩略图,并将响应插入到一个隐藏字段中。然后我隐藏上传图标,用一个删除图标替换它。如果点击删除图标,我会重置缩略图,清除隐藏字段,然后隐藏删除图标,显示上传图标。
当表单提交时,接收脚本会读取隐藏输入,并将这些图片和缩略图从临时文件夹移动到它们永久的文件夹。
我有一个cron作业正在运行,它检查临时文件夹中每个文件的修改时间,并与当前时间进行比较。如果两者之间的差异大于14400,我会删除该文件(4小时旧的)。我不只是清空文件夹,因为我可能会删除正在使用表单的用户上传的图片。如果有人花费超过四个小时提交一个包含不到10个字段的表单,他们遇到的问题比他们的上传消失要大得多。
对于那些说我应该有文件输入,以防万一有人禁用了javascript的人来说 - 我的网站是一个google maps mashup,所以如果他们没有启用javascript,他们就无法使用我的网站。
我唯一的问题是,为什么在iframe上传完成后,我的状态栏仍然显示一个进度条,即使所有请求都已完成?
谢谢
B
我可以在asp.net中使用这个UI吗?
我正在这个项目中使用jUploadify(你只能在注册后才能看到它,在你的个人资料页面(德语))-> http://1click.at/23s6h1
这个在谷歌浏览器中可以工作吗?
我认为演示不再有效,我还没有自己测试过实际的脚本。但我看到的只是查克·诺里斯的一张漂亮的照片,我在Chrome、Safari、Opera、IE7+8(XP和7)上测试了它 :)
这是另一个有趣的Ajax小玩意...
HTML5 Ajax网站http://bit.ly/9hXmZt
感谢你的帮助
您好,只是想确认一下它是否在IE中有效,我还想确认一下jQuery的最低版本要求。从演示中看到他们使用的是1.7.1;如果我使用的是jQuery 1.4.4,它会有效吗?
使用 AjaxUpload 插件的页面无法正常运行。还有其他地方可以获取该插件吗?