处理照片上传的最佳方法是什么?

时间:2008-09-16 16:37:27

标签: java php javascript flash

我正在为家庭成员的婚礼做一个网站。他们要求的一个功能是一个照片部分,所有的客人可以在婚礼后去上传他们的快照。我说这是一个很棒的主意,我去建造它。

那就是一个问题:物流。上传速度很慢,现代相机的照片很大(2-5 + Megs)。

我只需要~800px宽的图像,其中一些可能需要旋转才能理想我正在寻找使用客户端编辑器做三件事:

  1. 让用户选择多个文件
  2. 让他们旋转一些图像,使它们正确向上
  3. 调整大小,然后上传
  4. 在我的梦想世界中,它是免费的开源。有什么想法吗?

    提醒一下:这是客人必须使用的东西。他们中的一些人会非常精通计算机,但其他人几乎完全是文盲。安装桌面应用程序不是一个真正的选择。我假设其中98%安装了Flash和Java。

    编辑:我更喜欢SilverLight上的Flash / Java选项,不仅仅是因为它目前的安装率较低,而且因为我在Linux上并且我想测试它=)

20 个答案:

答案 0 :(得分:4)

我和Gallery好运。它是免费的,开源的,并且具有您提到的所有功能。

它允许您的用户上传照片而无需您的任何干预。

答案 1 :(得分:4)

最常见的解决方案是java applet,尽管其中大多数都不是免费的。例子:

答案 2 :(得分:4)

另一种选择可能是允许人们将照片上传到他们习惯使用的任何服务(flickr,google,smugmug或其他任何服务),只需接受该服务的用户名或文件夹的URL 。

然后,您可以让您的应用程序获取这些图片的副本,以便使用一致的界面在本地存储。

答案 3 :(得分:3)

我已经使用了很多swfupload。它非常棒:http://www.swfupload.org/

答案 4 :(得分:2)

如果您使用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

答案 5 :(得分:2)

我会使用applet。您可以调整图片的大小并在客户端进行旋转。

看起来JUpload可能会为您做到这一点。

答案 6 :(得分:1)

我完全赞同zigdon,允许不同的网站,但只能从网上获取照片。我仍然希望允许上传,并设置上限。

现在,如果你想把自己投入到一些大的东西中,我会建议对大小设置上限,然后使用JQuery(或其他库)来处理图像。

只需2美分

答案 7 :(得分:1)

答案 8 :(得分:1)

高度建议使用Lussomo的FileBrowser。它就像'拖放'一样简单:D

我已经将它用于我的游戏开发团队,在那里我们有超过200个概念艺术图像的原始转储,我们只是将FileBrowser提取到支持PHP的网络服务器并将图像转储到适当的目录中(每个专辑1个),并运行缩略图脚本。它可以处理图像的裁剪,并为您优化尺寸。比使用像Menalto Gallery这样的东西要好得多,你必须通过一个笨拙的上传界面上传它们。

答案 9 :(得分:1)

我目前需要实施与Oli类似的要求。

我相信Facebook.com使用某种类型的Java applet,它运行得很好,但我不确定applet是否可用作OSS。我将研究ScArcher2建议的JUpload。

如果你没有任何其他好的小程序,请保持它。

答案 10 :(得分:1)

取决于网络服务器。如果你可以使用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()  {
}
}

答案 11 :(得分:1)

使用Flickr路线非常简单,并且效果很好。

如果你想更高级,我建议snipshotpicknik(Flickr使用它)。两者都可以免费使用,并且可以使用API​​。

答案 12 :(得分:1)

你也可以让他们通过电子邮件将照片发送到picasa。 Picasa网站有一项功能,您可以将图像发送到“秘密”电子邮件,然后将其发布到Picasa帐户。设置一个picasa帐户,分发“秘密”电子邮件,并等待所有图片显示。

答案 13 :(得分:1)

Picasa是一款非常好/免费的照片管理应用。它让你做一些非常令人印象深刻的编辑,并具有上传功能,但我不记得它是否会上传到任何地方,或只是某些热门网站(如Flickr)。

答案 14 :(得分:1)

个人大多数用户都不理解DPI,他们的图像甚至比大多数托管公司所允许的php.ini更大。

我不确定你想要给予他们多少控制权,或者你希望公众方面的表现如何。

我建议使用Dropbox FTP应用程序,例如http://etonica.com/dropbox/index.html(tango dropbox)它对您的客户免费,您只需为您的版本付费,这样您就可以设置FTP信息并加以保护。< / p>

我让他们下载一些链接paint.net(这是免费的)让他们编辑照片到适当的大小,然后将它们拖放到这个应用程序。它很简单,不需要修改php.ini。

你也可以使用像slideshowpro的导演应用程序那样的东西。

答案 15 :(得分:1)

通过电子邮件发送照片可用选项吗?

大多数想要分享照片的人可能已经知道如何通过电子邮件发送照片。大多数电子邮件客户端已经解决了文件上传的问题。

只需设置一个gmail / whatevermail帐户,让您的网站在收件箱中进行投票。

这类似于TwitPic对twitter的作用,但您的要求似乎比这更简单。

答案 16 :(得分:1)

出于好奇,在这个网络堆栈上运行?灯? 2K3 + IIS?等等?许多开源解决方案都是跨平台的,但其他解决方案不是......

答案 17 :(得分:1)

如何使用PhotoShop Online它允许您使用基于Web的编辑器编辑照片并提供2GB的存储空间。我自己没有使用它,所以不知道它是否允许多个用户通过

访问同一个帐户

答案 18 :(得分:1)

您可以使用Silverlight或Flash或某些自定义插件来允许托管上传,例如,您可以在其中显示进度条。关于上传速度你无能为力,但你至少可以在进行中显示进度。

我不知道你可以使用任何罐装上传程序,但制作它不应该太难(除非你不知道Flash或Silverlight)。

答案 19 :(得分:-1)

GIMP(http://www.gimp.org/)是进行调整大小的好工具,是开源的。