代码之家  ›  专栏  ›  技术社区  ›  Oli

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

  •  11
  • Oli  · 技术社区  · 17 年前

    我正在为一个家庭成员的婚礼做一个网站。他们要求的一个功能是照片区,所有客人都可以在婚礼后去上传他们的照片。我说这是一个很棒的想法,然后我就去建造它了。

    只有一个问题:物流。上传速度很慢,现代相机的照片很大(2-5Mgs以上)。

    我只需要大约800像素宽的图像,其中一些可能需要旋转,所以理想情况下,我正在考虑使用客户端编辑器做三件事:

    1. 允许用户选择多个文件
    2. 让他们旋转一些图像,让它们朝上
    3. 调整大小,然后上传

    在我的梦想世界里,它将是免费和开源的。有什么想法吗?

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

    编辑:比起SilverLight,我更喜欢Flash/Java选项,不仅因为它目前的安装率较低,还因为我在Linux上,我想测试一下=)

    20 回复  |  直到 17 年前
        1
  •  4
  •   Mauricio Scheffer    17 年前

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

        2
  •  4
  •   Kyle Renfro    17 年前

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

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

        3
  •  4
  •   zigdon    17 年前

    另一种选择是允许人们将照片上传到他们习惯使用的任何服务(flickr、谷歌、自以为是或任何其他服务),并只接受该服务的用户名或文件夹的URL。

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

        4
  •  3
  •   Sleep Deprivation Ninja    17 年前

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

        5
  •  2
  •   mikechambers    17 年前

    如果你正在使用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

        6
  •  2
  •   ScArcher2    17 年前

    我会使用小程序。您可以在客户端调整图片的大小和旋转。

    看起来像 JUpload 可以为你做这件事。

        7
  •  1
  •   swilliams    17 年前

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

        8
  •  1
  •   justin.m.chase    17 年前

    您可以使用Silverlight或Flash或一些自定义插件来允许托管上传,例如,您可以在其中显示进度条。对于上传速度,你无能为力,但你至少可以在上传过程中向他们展示进度。

    我不知道有什么现成的上传程序可以使用,但制作一个应该不会太难(除非你不知道Flash或Silverlight)。

        9
  •  1
  •   Katy    17 年前

    使用怎么样 PhotoShop Online 它允许您使用基于网络的编辑器编辑照片,并提供2GB的存储空间。我自己没有使用过它,所以不知道它是否允许多个用户访问同一个帐户

        10
  •  1
  •   Grank    17 年前

    出于好奇,这是在什么网络堆栈上运行的?灯?2k3+IIS?等等?许多开源解决方案都是跨平台的,但也有一些不是。..

        11
  •  1
  •   chakrit Dutchie432    17 年前

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

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

    只需设置一个gmail/whatevermail帐户,让您的网站对收件箱进行轮询。

    这有点像什么 TwitPic twitter也是如此,但你的要求似乎比这更简单。

        12
  •  1
  •   Brian Brian    17 年前

    就个人而言,大多数用户不了解DPI,他们的图像甚至被修剪得比大多数托管公司允许的php.ini更大。

    我不确定你想给他们多大的控制权,也不确定你希望公众如何表现。

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

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

    你也可以使用类似幻灯片专业的导演应用程序。

        13
  •  1
  •   Changos    17 年前

    我完全同意zigdon的观点,允许不同的网站,但只从网上获取照片。你仍然想允许上传,并限制大小。

    现在,如果你想全身心投入到某个大项目中,我建议限制大小,然后使用JQuery(或其他库)处理图像。

    只有我的2美分

        14
  •  1
  •   Changos    17 年前

    你也可以让他们把照片通过电子邮件发给皮卡萨。Picasa网络有一个功能,您可以将图像发送到一个“秘密”电子邮件,该电子邮件会将它们发布到Picasa帐户。设置一个picasa帐户,分发“秘密”电子邮件,等待所有图片显示出来。

        15
  •  1
  •   Gaurav    17 年前

    走Flickr路线很容易,而且会很好地发挥作用。

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

        16
  •  1
  •   c.sokun    17 年前

    我目前需要执行与Oli类似的要求。

    我相信Facebook.com使用某种java applet,它工作得很好,但我不确定applet是否可以作为OSS使用。我将研究ScArcher2建议的JUpload。

    如果你没有其他好的小程序,请继续使用。

        17
  •  1
  •   Karan    17 年前

    我愿意 非常 建议使用 FileBrowser Lussomo。这就像“拖放”一样简单:D

    我把它用于我的游戏开发团队,在那里我们有200多个概念艺术图像的原始转储,我们只是将FileBrowser提取到支持PHP的Web服务器上,并将图像转储到适当的目录中(每个相册一个),然后运行缩略图脚本。它处理图像的裁剪,并为您优化其大小。这比使用Menalto Gallery这样的东西要好得多,在那里你必须通过一个尴尬的上传界面上传它们。

        19
  •  1
  •   Neil Masson    10 年前

    取决于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()  {
    }
    }
    
        20
  •  -1
  •   jeffrey    17 年前

    GIMP( http://www.gimp.org/ )是一个很好的调整大小的工具,并且是开源的。