史上最短的图片上传器!

只需几行 JavaScript 代码。

这是一个非常简短的图片上传器,基于 imgur.com API。 如果你想做更复杂的事情(比如调整大小、裁剪、绘图、颜色等),请查看我的 上一篇博文.

背景故事:我一直在和 Imgur.com 的所有者(嗨,艾伦!)聊天。 他 最近为他的图片分享网站添加了拖放支持。 同时,艾伦还允许使用 跨域 XMLHttpRequest(谢谢!)。 因此,基本上,您可以使用他的 API 从您的 HTML 页面上传图片到他的网站,而无需任何服务器端代码 — 根本不需要。

以下是一个示例,您可以参考:

(查看完整的代码,可在 github 上获取 - 实时版本 在此

(另外,您需要了解 FormData,请查看 此处

function upload(file) {

  // file is from a  tag or from Drag'n Drop
  // Is the file an image?

  if (!file || !file.type.match(/image.*/)) return;

  // It is!
  // Let's build a FormData object

  var fd = new FormData();
  fd.append("image", file); // Append the file
  fd.append("key", "6528448c258cff474ca9701c5bab6927");
  // Get your own key: http://api.imgur.com/

  // Create the XHR (Cross-Domain XHR FTW!!!)
  var xhr = new XMLHttpRequest();
  xhr.open("POST", "http://api.imgur.com/2/upload.json"); // Boooom!
  xhr.onload = function() {
    // Big win!
    // The URL of the image is:
    JSON.parse(xhr.responseText).upload.links.imgur_page;
   }
   // Ok, I don't handle the errors. An exercice for the reader.
   // And now, we send the formdata
   xhr.send(fd);
 }

就这样 :)

适用于 Chrome 和 Firefox 4(**编辑:**)以及 Safari。

关于 Paul Rouget

Paul 是一位 Firefox 开发者。

更多 Paul Rouget 的文章……


18 条评论

  1. Tobias Plutat

    不错!而且注释也很清晰 — 我对代码半懂半不懂,有用的注释对我有很大帮助。

    为你和 imgur 点赞!

    2011 年 3 月 11 日 下午 4:30

  2. Robin Berjon

    很酷。 小调整:您想锚定该媒体类型正则表达式,以便它不会匹配像 application/cool-image 这样的内容。 不是

    file.type.match(/image.*/)

    而是

    file.type.match(/^image/.+/)

    就足够了。

    2011 年 3 月 11 日 下午 5:15

  3. Pedro Assunção

    很不错,12 行代码(如果我们算上 })。 做得好 :)

    2011 年 3 月 11 日 下午 5:26

  4. gmoulin

    在 Minefield 上使用 Firebug
    未捕获异常:[Exception… “Component returned failure code: 0x805e0006 [nsIXMLHttpRequest.open]” nsresult: “0x805e0006 ()” location: “JS frame :: http://paulrouget.github.com/miniuploader/ :: upload :: line 62″ data: no]
    炸药确实会爆炸;)。

    2011 年 3 月 11 日 下午 6:11

  5. Álvaro G. Vicario

    /image.*/ 是一个正则表达式。 它也会匹配像 “application/x-apple-diskimage” 这样的东西。

    您可能想要类似以下内容:

    /^image//

    不过代码很不错。

    2011 年 3 月 11 日 下午 6:19

  6. rad_g

    看起来不像几行代码。

    2011 年 3 月 11 日 下午 6:40

    1. Isuru Nanayakkara

      哦,抱歉,你是英语老师吗?

      2012 年 4 月 5 日 下午 4:39

  7. Scott Baker

    EasyCapture 的功能与您描述的功能类似

    http://www.perturb.org/display/Announcing_EasyCapture_0_51.html

    2011 年 3 月 11 日 上午 9:07

  8. Fahd Alwashmi

    酷酷酷酷酷,谢谢

    2011 年 3 月 11 日 上午 9:16

  9. Mark Smith

    在 Safari 中也适用…… 即使你们 Mozilla 人不喜欢 Apple,也值得一提。

    2011 年 3 月 11 日 下午 1:47

    1. Paul Rouget

      哎呀,我不知道他们支持 FormData! 已修复 :)

      2011 年 3 月 14 日 下午 4:40

  10. john

    Ajax 应该在此处无法提交,因为您正在发布到与托管此 HTML 页面的域不同的域。 (imgur.com mydomain.com)。

    您是如何绕过此安全限制的? 或者,这仅适用于 Firefox 的某些特殊版本,这些版本已禁用此限制? (在这种情况下,为什么被禁用? 这不是安全漏洞吗?)

    2011 年 3 月 11 日 下午 10:07

    1. Ward Muylaert

      “同时,艾伦还允许使用跨域 XMLHttpRequest(谢谢!)。 因此,基本上,您可以使用他的 API 从您的 HTML 页面上传图片到他的网站,而无需任何服务器端代码 — 根本不需要。”

      2011 年 3 月 14 日 下午 4:53

  11. voidmind

    @john,我怀疑关于无需任何服务器端代码 — 根本不需要的部分是错误的。 该 POST 图片数据必须由某个服务器端脚本处理,以便将其写入磁盘。 我怀疑该服务器端脚本会发送 CORS 标头以允许像这样进行跨站点脚本

    header(Access-Control-Allow-Origin: *);
    header(Access-Control-Allow-Methods: POST);

    http://www.w3.org/TR/cors/

    2011 年 3 月 14 日 下午 6:30

  12. john

    @voidmind:谢谢! 从承认无知中学习新事物,每天都有。 很高兴我这么做了,感谢您的提示。

    2011 年 3 月 14 日 上午 9:08

  13. Tim

    JSON 上传文件是什么样的?

    2011 年 6 月 17 日 上午 10:13

  14. zeuf

    是的,请
    UPLOAD.JSON 长什么样?
    谢谢!

    2012 年 7 月 19 日 下午 6:15

  15. Forrest O.

    Paul,你应该和艾伦谈谈,让他在他们_提供_的图片上启用 CORS 标头,这样我们就可以在客户端操作它们:http://imgur.userecho.com/topic/105409-enable-cross-origin-resource-sharing-cors/

    2012 年 9 月 26 日 上午 3:53

本文的评论已关闭。