Perl 和 Amazon 云,第 2 部分:通过 HTML 表单将数据安全地上传到 S3
2010-02-04 00:00:00 来源:WEB开发网这段 JavaScript 代码有些难看,但是应当可以在大部分现代浏览器中正常工作。实际上,我们拦截了提交按钮,并且只有在知道所上传文件的类型的情况下才返回 true。
清单 3 中粗体显示的两行脚本不应当像上面那样被打断,但我们的显示宽度有限。如果要从本文复制并粘贴此脚本,那么需要将这两行脚本恢复为一行代码。它们被正确放置在脚本中,您可以下载此脚本。
上传表单:JavaScript 和原理
您将从 Google API 站点加载 Prototype。如果您有多疑症或强迫症的话(您的多疑并不表示它们不存在),您可以自己托管它。
使用 Prototype 实用工具从表单获取文件名,然后查看文件名(使用小写)。对于每一个浏览器已知的 MIME 类型,使用 Prototype detect() 数组方法查找与以下条件的第一个匹配:
类型必须长于三个字符。
必须包含一个 / 字符。
MIME 类型的任何后缀都必须匹配文件名。
三字符检查和 / 字符检查是由于在 Firefox 中,(至少)有一个 “*” MIME 类型将匹配任何内容。由于没有什么用处,您希望能够跳过这些检查(我们也希望),并且任何其他 MIME 类型都不会影响我们要实现的目标。
您将使用 JavaScript split() 字符串方法遍历后缀,这将生成一个数组。因此,如果后缀为 jpg,jpeg,那么将遍历那些使用逗号分隔为两部分的内容。再一次,使用 Prototype detect() 数组方法在后缀中寻找与文件名的第一个匹配。比较小写形式的后缀和文件。
如果搞混了的话,再大致研究一下 Prototype 和 JavaScript。目前可以假设适合用于大多数情况。对于较旧的或不常见的 Web 浏览器可能不行,当然,如果用户禁用了 JavaScript 则肯定不能工作。现实就是这样。我们只能寻找适合大多数用户的方法。
如果类型声明失败,那么我们也会失败。尽管它将向用户显示一条消息,但是可以做得更好。比如,您可以尝试做一些猜测,如果不知道类型的话,那么可以回到以前的图像/jpeg。您可以做出一些改进。声明失败的话,函数将返回 false,这将阻断上传。
注意,对于成功的上传,您将被重定向到一个包含用户名的 URL。请参见 “上传到 S3” 理解这样做的原因。
最后,这个脚本将 Perl、JavaScript 和 HTML 混合到一个有趣的 包(想像一辆扬着帆,掌着方向盘还吹奏着萨克斯的跑车)。为展示一种特殊技巧而编写的示例不应当作为您的设计和架构指导。我建议您不要完全复制和粘贴这里包含的脚本,至少应该考虑将它分解成模板片段并进行重构。在本系列后续文章中,我将向您展示如何在 mod_perl Web 站点的完整上下文中实现这些操作。
结束语
通过本文您了解了如何设置 HTML 上传表单将文件直接上传到 S3。我们用到了 Perl、JavaScript 和 HTML。本文给出了一个使用 Prototype JavaScript 库的脚本、Perl MIME::Base64 和 Digest::HMAC_SHA1 模块,以及内联的 JavaScript 和 HTML,并且提到一些注意事项。脚本将针对给定用户将文件上传到 S3,并最终重定向到 share.lifelogs.com 站点上的一个特定的有效 URL。
本系列的第 3 部分将展示这个有效的 URL 如何为上传的文件创建 SimpleDB 记录。您还将发现对于特定用户,如何以 SimpleDB 记录的形式创建、编辑和删除某张照片的评论。第 4 部分和第 5 部分将为您组装 mod_perl Web 站点,请继续关注。
本文示例源代码或素材下载
- ››Perl 6 发布
- ››部分 WM6.5 手机有望升级到 Windows Phone 7
- ››Perl 和 Amazon 云,第 1 部分:通过构建简单的照...
- ››Perl 和 Amazon 云,第 2 部分:通过 HTML 表单将...
- ››Perl 和 Amazon 云,第 3 部分:上传图像并创建、...
- ››Perl 和 Amazon 云,第 4 部分:深入探究完整 mod...
- ››Perl 和 Amazon 云,第 5 部分:了解完整 mod_per...
- ››部分英特尔芯片不支持Windows 7“XP模式”
- ››Perl的5个常见错误
- ››Perl操作mysql数据库的方法
- ››Perl的经典用法
- ››部分VZPP无法正常访问怎么解决?
更多精彩
赞助商链接