处理照片上传的最佳方式是啥?
Posted
技术标签:
【中文标题】处理照片上传的最佳方式是啥?【英文标题】:What is the best way to handle photo uploads?处理照片上传的最佳方式是什么? 【发布时间】:2010-09-09 14:43:34 【问题描述】:我正在为一个家庭成员的婚礼做一个网站。他们要求的一个功能是一个照片部分,所有客人都可以在婚礼后去上传他们的照片。我说这是一个很棒的想法,然后我就着手构建它。
只有一个问题:物流。上传速度很慢,来自现代相机的照片很大(2-5+Megs)。
我只需要约 800 像素宽的图片,其中一些可能需要旋转,所以理想情况下我正在寻找使用客户端编辑器来做三件事:
-
让用户选择多个文件
让他们旋转一些图像,使它们以正确的方式向上
调整大小然后上传
在我的梦想世界中,它是免费和开源的。有什么想法吗?
提醒一下:这是客人必须使用的东西。他们中的一些人非常精通计算机,但其他人几乎完全是文盲。安装桌面应用程序并不是一个真正的选择。我假设其中 98% 都安装了 Flash 和 Java。
编辑:我更喜欢 Flash/Java 选项而不是 SilverLight,这不仅是因为它目前的安装率较小,而且还因为我在 Linux 上并且我想对其进行测试 =)
【问题讨论】:
您可以使用月光来测试您的应用程序。 【参考方案1】:Picasa 是一款非常棒/免费的照片管理应用。它可以让您进行一些令人印象深刻的编辑,并具有上传功能,但我不记得它是否会上传到任何地方,或者只是某些流行的网站(如 Flickr)。
【讨论】:
对不起,我应该澄清一下。这是给客人的,不是给我的。其中一些人是计算机文盲=( 哦,你想让它在网页中运行吗?没有更好的词,作为 Applet? Picasa 仅上传到 google 的服务 picasaweb。它对于编辑照片仍然很有用,但如果您希望它转到任意站点,您仍然需要一个上传器。 是的,我正在寻找某种 Applet。我已经对主要帖子进行了几次编辑,现在对其进行概述。 只要大写“嵌入网页”即可:-p【参考方案2】:您可以使用 Silverlight 或 Flash 或一些自定义插件来允许托管上传,例如,您可以在其中显示进度条。关于上传速度,您无能为力,但您至少可以在上传过程中向他们展示进度。
我不知道您可以使用任何预制上传程序,但制作一个应该不会太难(除非您不了解 Flash 或 Silverlight)。
【讨论】:
【参考方案3】:GIMP (http://www.gimp.org/) 是一个很好的调整大小的工具,并且是开源的。
【讨论】:
真的吗?您对“几乎完全文盲”的人的建议是 GIMP?【参考方案4】:我与Gallery 相处得很好。它是免费的、开源的,并且具有您提到的所有功能。
它将允许您的用户上传照片而无需您的任何干预。
【讨论】:
【参考方案5】:使用PhotoShop Online 怎么样?它允许您使用基于网络的编辑器编辑照片,并提供 2GB 的存储空间。我自己没有使用过,所以不知道它是否允许多个用户访问同一个帐户
【讨论】:
【参考方案6】:出于好奇,这是在哪个网络堆栈上运行的?灯? 2k3+IIS?等等等等?许多开源解决方案都是跨平台的,但其他的则不是......
【讨论】:
【参考方案7】:另一种选择是允许人们将照片上传到他们习惯使用的任何服务(flickr、google、smugmug 或任何其他服务),并且只需接受该服务的用户名或文件夹的 URL .
然后,您可以让您的应用程序获取这些图片的副本,以使用一致的界面存储在本地。
【讨论】:
我认为这是最明智的解决方案。在线照片托管网站已经有了调整照片大小和旋转照片的工具,那么为什么要重新发明***呢? Flickr 有很多通过提要获取数据的选项:flickr.com/services/feeds【参考方案8】:通过电子邮件发送照片是否可用?
大多数想要分享照片的人可能已经知道如何通过电子邮件发送照片。而且大部分邮件客户端已经解决了文件上传的问题。
只需设置一个 gmail/whatevermail 帐户,然后让您的网站轮询收件箱。
这类似于 TwitPic 为 twitter 所做的事情,但您的要求似乎比这更简单。
【讨论】:
【参考方案9】:如果您使用 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 源或 API 加载到用户站点:
http://www.flickr.com/help/picnik/
http://www.flickr.com/services/api/
希望对您有所帮助...
麦克室
mesh@adobe.com
【讨论】:
【参考方案10】:就个人而言,大多数用户不了解 DPI,而且他们的图像即使被修剪,最终也会比大多数托管公司所允许的 php.ini 大。
我不确定你想给他们多少控制权,也不知道你希望公众如何表现。
我建议使用诸如http://etonica.com/dropbox/index.html(tango dropbox)之类的保管箱 FTP 应用程序。它对您的客户免费,您只需为您的版本付费,这样您就可以设置 FTP 信息并保护它。
我会让他们下载一些链接paint.net(免费)让他们将照片编辑到适当的大小,然后将它们拖放到此应用程序中。很简单,不需要修改php.ini。
您也可以使用类似 slideshowpro 的导演应用程序。
【讨论】:
【参考方案11】:我完全同意 zigdon,允许不同的网站,但只从网络上获取照片。我仍然想允许上传,并设置大小上限。
现在,如果您想投身于大事,我建议设置大小上限,然后使用 JQuery(或其他库)处理图像。
只要我的 2 美分
【讨论】:
【参考方案12】:您也可以让他们通过电子邮件将图片发送到 picasa。 Picasa 网络有一项功能,您可以将图像发送到“秘密”电子邮件,然后将它们发布到 picasa 帐户。设置一个 picasa 帐户,分发“秘密”电子邮件,然后等待所有图片显示出来。
【讨论】:
【参考方案13】:我会使用小程序。您可以在客户端调整图片大小和旋转。
看起来JUpload 可以为你做这件事。
【讨论】:
【参考方案14】:我用过很多次swfupload。太棒了:http://www.swfupload.org/
【讨论】:
哦,感谢上帝,这正是我正在寻找的一个项目中的内容。你是救世主!!!谢谢。【参考方案15】:走 Flickr 路线很简单,而且效果很好。
如果你想更高级,我推荐snipshot 或picknik(Flickr 使用它)。两者都可以免费使用,并且有 API 可供使用。
【讨论】:
【参考方案16】:取决于网络服务器。如果你可以使用 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()
【讨论】:
【参考方案17】:我目前需要实现与 Oli 类似的要求。
我相信 Facebook.com 使用某种 java 小程序,它工作得很好,但我不确定该小程序是否可用作 OSS。我将研究 ScArcher2 建议的 JUpload。
如果你没有任何其他好的小程序,请继续提供。
【讨论】:
【参考方案18】:对此最常见的解决方案是 java 小程序,尽管它们中的大多数都不是免费的。例子:
http://www.jumploader.com/ http://www.aurigma.com/Products/ImageUploader/OnlineDemo.aspx http://www.javaatwork.com/java-upload-applet/details.html JUpload,由 ScArcher2 提及【讨论】:
我希望 JumpLoader 在 Linux 上工作。有一个错误(我现在已经报告过),它没有加载到 IcedTea/OpenJDK 上。 好吧,我昨天给 JumpLoader 创建者发了电子邮件,今天收到了一个快速的 MSN 消息交换,几分钟后,有一个兼容 OpenJDK 的版本。魔法!! JumpLoader 比许多 50 美元以上的解决方案好几英里,而且免费(限制非常宽松)。 我也使用 JumpLoader,它是一个很棒的产品。支持也很棒,他们不仅回复速度非常快,而且在几分钟内就能修复错误。【参考方案19】:我高度建议使用 Lussomo 的 FileBrowser。就像“拖放”一样简单:D
我已将它用于我的游戏开发团队,我们有超过 200 个概念艺术图像的原始转储,我们只需将 FileBrowser 提取到支持 PHP 的网络服务器并将图像转储到适当的目录中(每个专辑 1 个),并运行缩略图脚本。它处理图像的裁剪,并为您优化它们的大小。比使用 Menalto Gallery 之类的东西要好得多,因为您必须通过笨拙的上传界面上传它们。
【讨论】:
【参考方案20】:试试这个 http://www.lunarvis.com/products/tinymcefilebrowserwithupload.php
【讨论】:
以上是关于处理照片上传的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章