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

11

我正在为一个家庭成员的婚礼做网站。他们要求添加一个照片版块,所有客人可以在婚礼后上传他们的照片。我认为这是个绝佳的主意,于是就去构建它。

然而,有个问题:物流问题。上传速度很慢,现代相机拍摄的照片非常大(2-5+兆字节)。

我只需要 ~800像素宽的图片,其中一些可能需要旋转,因此最好使用客户端编辑器来完成三件事:

  1. 让用户选择多个文件
  2. 让他们旋转某些图像以使它们朝上
  3. 调整大小后上传

在我的理想世界中,它应该是免费且开源的。有什么好的想法吗?

请记住:这是客人将使用的东西。他们中的一些人可能非常懂电脑,但其他人几乎完全文盲。安装桌面应用程序不是一个真正的选择。我假设他们中的98%已经安装了 Flash 和 Java。

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


您可以使用Moonlight来测试您的应用程序。 - jaircazarin-old-account
20个回答

4

我希望JumpLoader在Linux上能够正常工作。目前我已经报告了一个错误,它无法在IcedTea/OpenJDK上加载。 - Oli
4
昨天我给JumpLoader的开发者发送了电子邮件,今天进行了一次快速的MSN消息交流,几分钟后就有了一个兼容OpenJDK的版本。真是魔术!!JumpLoader比很多50美元以上的解决方案都要好得多,而且是免费的(使用限制相对宽松)。 - Oli
我也使用JumpLoader,它是一个很棒的产品。支持也非常好,他们不仅回复速度很快,而且在几分钟内修复漏洞。 - Mauricio Scheffer

4
我使用过Gallery,非常好用。它是免费的开源软件,并且拥有您提到的所有功能。它可以让用户上传照片,而不需要您进行干预。

4
另一个选择是允许人们上传他们的照片到他们惯用的服务(如flickr、google、smugmug或其他任何服务),然后只接受该服务的用户名或文件夹的URL。这样,您的应用程序就可以通过一致的界面获取这些图片的副本并将其存储在本地。

我认为这是最明智的解决方案。在线照片托管网站已经有了调整大小和旋转照片的工具,那为什么要重复发明轮子呢?Flickr通过提供数据源有许多选项:http://www.flickr.com/services/feeds/ - Garrett Albright

3

哦,谢天谢地啊,伙计,这正是我正在进行的项目所需要的东西。你真是我的救星!谢谢。 - bryanpearson

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


2
我会使用小程序。您可以在客户端上调整图片大小和旋转。
看起来JUpload可以为您完成此操作。

1

这取决于Web服务器。如果您可以使用servlets,请尝试以下方法:

// 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()  {
}
}


1

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

我相信Facebook.com使用某种Java小程序,它运行得非常好,但我不确定该小程序是否作为开源软件可用。我将研究ScArcher2建议的JUpload。

如果你们知道其他好的小程序,请继续推荐。


1

强烈建议使用Lussomo的FileBrowser。它就像“拖放”一样容易 :D

我曾经在我的游戏开发团队中使用过它,我们有超过200张概念艺术图片的原始转储,我们只需将FileBrowser提取到启用PHP的Web服务器上,并将图像转储到适当的目录中(每个相册一个),然后运行缩略图脚本。它处理图像的裁剪和优化大小。比使用Menalto Gallery之类的东西要好得多,因为你不必通过笨拙的上传界面上传它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接