处理照片上传的最佳方法是什么?
我正在做一个家庭成员婚礼的网站。他们要求提供的一个功能是照片区,所有宾客都可以在婚礼后去那里并上传他们的快照。我说这是一个很棒的主意,所以我去建立它。
好吧,这只是一个问题:物流。上传速度很慢,并且来自现代相机的照片非常大(2-5 + Megs)。
我只需要约800px宽的图像,其中一些图像可能需要旋转,因此理想情况下,我正在考虑使用客户端编辑器来做三件事:
- 让用户选择多个文件
- 让他们旋转一些图像,使它们朝上正确的方向
- 调整大小然后上传
在我的梦想世界中,它将是免费和开源的。有任何想法吗?
提醒一下:这是客人必须使用的东西。他们中有些人会精通计算机,而另一些人几乎完全是文盲。安装桌面应用程序并不是真正的选择。我认为其中98%的人安装了Flash和Java。
编辑:我更喜欢Flash / Java选项而不是SilverLight,不仅因为它目前的安装率较小,而且还因为我在Linux上并且想对其进行测试=)
解决方案
回答
Picasa是一款非常出色/免费的照片管理应用程序。它使我们进行一些令人印象深刻的编辑,并具有上传功能,尽管我不记得它是否可以上传到任何地方,或者仅上传到某些受欢迎的网站(如Flickr)。
回答
我们可以使用Silverlight或者Flash或者某些自定义插件来允许托管上传,例如,我们可以在其中显示进度栏。关于上传速度,我们无能为力,但我们至少可以显示上传速度。
我不知道我们可以使用任何预设的上传程序,但是制作一个应该不难(除非我们不知道Flash或者Silverlight)。
回答
GIMP(http://www.gimp.org/)是调整大小的好工具,并且是开源的。
回答
我在Gallery祝你好运。它是免费的开放源代码,并具有我们提到的所有功能。
它将允许用户上传照片而无需任何干预。
回答
如何使用PhotoShop Online它允许我们使用基于Web的编辑器编辑照片,并提供2GB的存储空间。我自己没有使用过,所以不知道它是否允许多个用户访问同一帐户
回答
出于好奇,这要在哪个Web堆栈上运行?灯? 2k3 + IIS?等等等等?那里的许多开源解决方案都是跨平台的,但其他解决方案则不是。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
回答
另一种选择是允许人们将照片上传到他们习惯使用的任何服务(flickr,google,smugmug或者任何其他服务),并且仅接受该服务的用户名或者文件夹的URL。
然后,我们可以让应用程序获取这些图片的副本,以使用一致的界面本地存储。
回答
是否可以通过电子邮件发送照片?
大多数想要共享照片的人可能已经知道如何通过电子邮件发送照片。大多数电子邮件客户端已经解决了文件上传问题。
只需设置一个gmail / whatevermail帐户,然后让网站轮询收件箱即可。
就像TwitPic对Twitter所做的一样,但要求似乎比这更简单。
回答
如果使用Flash并使用Flickr进行此操作,那么我将签出AS3 Flickr库:
http://code.google.com/p/as3flickrlib/
支持上传图片。
上载需要身份验证。该库还包含用于处理此问题的基于Flex的控件:
http://www.mikechambers.com/blog/2008/08/12/flex-based-flickr-api-authorization-control/
(该库的其余部分是ActionScript 3,可以在Flex或者Flash中使用。
可能最简单的解决方案是将图像上传到Flickr,在Picnik中进行编辑(现在已内置到Flickr中),然后使用Flickr RSS feed或者API加载到用户站点上:
http://www.flickr.com/help/picnik/
http://www.flickr.com/services/api/
希望有帮助...
迈克·钱伯斯
回答
个人而言,大多数用户不了解DPI,其图像甚至被修剪后最终超出了大多数托管公司允许的php.ini。
我不确定我们要给他们多少控制权,或者我们希望公众如何表现。
我建议我们使用一个保管箱FTP应用程序,例如http://etonica.com/dropbox/index.html(探戈保管箱)。它对客户是免费的,我们只需支付版本费用即可设置FTP信息并保护它。
我希望他们下载一些链接paint.net(免费),让他们将照片编辑为适当的大小,然后将其拖放到此应用程序中。这很容易,不需要修改php.ini。
我们还可以使用诸如slideshowpro的Director应用程序之类的东西。
回答
我完全同意zigdon,允许使用其他网站,但只能从网络上获取照片。我仍然要允许上传,并限制其大小。
现在,如果我们想投入大量精力,我建议设置大小上限,然后使用JQuery(或者其他库)处理图像。
就是我的2美分
回答
我们也可以让他们通过电子邮件将图片发送到picasa。 Picasa网络版具有一项功能,我们可以将图像发送到"秘密"电子邮件,该电子邮件会将其发布到picasa帐户。设置一个picasa帐户,分发"秘密"电子邮件,然后等待所有图片显示出来。
回答
我会用一个小程序。我们可以调整图片的大小并在客户端旋转。
看起来JUpload可以为我们做到这一点。
回答
我已经使用了swfupload了很多。非常棒:http://www.swfupload.org/
回答
沿着Flickr路线走很容易,而且效果很好。
如果我们想更高级,我建议我们使用片段或者picknik(Flickr使用它)。两者都可以免费使用,并且可以使用API。
回答
取决于Web服务器。如果可以使用servlet,请尝试以下操作:
// UploadServlet.java : Proof of Concept - Mike Smith March 2006 // Accept a file from the client, assume it is an image, rescale it and save it to disk for later display import javax.servlet.http.*; import javax.imageio.*; import java.io.*; import java.util.*; import java.sql.*; import org.apache.commons.fileupload.*; import org.apache.commons.fileupload.disk.*; import org.apache.commons.fileupload.servlet.*; import java.awt.image.*; import java.awt.*; public class UploadServlet extends HttpServlet { public static void printHeader(PrintWriter pw) { pw.println("<HEAD><TITLE>Upload Servlet</TITLE><HEAD>"); pw.println("<BODY>"); } public static void printTrailer(PrintWriter pw) { pw.println("<img src=\"../images/poweredby.png\" align=left>"); pw.println("<img src=\"../images/tomcat-power.gif\" align=right>"); pw.println("</BODY></HTML>"); } public void init() { // Servlet init() : called when the servlet is LOADED (not when invoked) } public void service(HttpServletRequest req, HttpServletResponse res) throws IOException { DiskFileItemFactory dfifact; ServletFileUpload sfu; java.util.List items; Iterator it; FileItem fi; String field, filename, contype; boolean inmem, ismulti; long sz; BufferedImage img; int width, height, nwidth, nheight, pixels; double scaling; final int MAXPIXELS = 350 * 350; res.setContentType("text/html"); PrintWriter pw = res.getWriter(); printHeader(pw); ismulti = FileUpload.isMultipartContent(req); if (ismulti) { pw.println("Great! Multipart detected"); dfifact = new DiskFileItemFactory(999999, new File("/tmp")); sfu = new ServletFileUpload(dfifact); try { items = sfu.parseRequest(req); } catch (FileUploadException e) { pw.println("Failed to parse file, error [" + e + "]"); printTrailer(pw); pw.close(); return; } it = items.iterator(); while (it.hasNext()) { fi = (FileItem) it.next(); if (fi.isFormField()) { pw.println("Form field [" + fi.getFieldName() + "] value [" + fi.getString() + "]"); } else { // Its an upload field = fi.getFieldName(); filename = fi.getName(); contype = fi.getContentType(); inmem = fi.isInMemory(); sz = fi.getSize(); pw.println("Upload field=" + field + " file=" + filename + " content=" + contype + " inmem=" + inmem + " size=" + sz); InputStream istream = fi.getInputStream(); img = ImageIO.read(istream); nwidth = width = img.getWidth(); nheight = height = img.getHeight(); pixels = width * height; if (pixels > MAXPIXELS) { scaling = Math.sqrt((double) MAXPIXELS / (double) pixels); nheight = (int) ((double) height * scaling); nwidth = (int) ((double) width * scaling); } BufferedImage output = new BufferedImage(nwidth, nheight, BufferedImage.TYPE_3BYTE_BGR); Graphics2D g = output.createGraphics(); g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g.drawImage(img, 0, 0, nwidth, nheight, null); ImageIO.write(output, "jpeg", new File("/var/tomcat/webapps/pioneer/demo.jpg")); istream.close(); } } } else pw.println("Bugger! Multipart not detected"); printTrailer(pw); pw.close(); } public void destroy() { } }
回答
目前,我需要执行与Oli类似的要求。
我相信Facebook.com使用某种Java小程序,并且运行良好,但是我不确定小程序是否可以作为OSS使用。我将研究ScArcher2建议的JUpload。
如果我们没有其他任何好用的applet,请继续进行下去。
回答
最常见的解决方案是java applet,尽管其中大多数不是免费的。例子:
- http://www.jumploader.com/
- http://www.aurigma.com/Products/ImageUploader/OnlineDemo.aspx
- http://www.javaatwork.com/java-upload-applet/details.html
- JUPload,ScArcher2提到
回答
我强烈建议使用Lussomo的FileBrowser。就像"拖放"一样简单:D
我曾在游戏开发团队中使用过它,其中有200多个概念艺术图像的原始转储,我们只是将FileBrowser提取到支持PHP的网络服务器中,并将图像转储到适当的目录中(每张专辑1个),缩略图脚本。它可以处理图像并为我们优化图像的大小。比使用诸如Menalto Gallery之类的东西要好得多,在这种情况下,我们必须通过笨拙的上传界面来上传它们。
回答
试试看
http://www.lunarvis.com/products/tinymcefilebrowserwithupload.php