Каков наилучший способ обработки загрузки фотографий? - PullRequest
11 голосов
/ 16 сентября 2008

Я делаю сайт для свадьбы члена семьи. Особенностью, которую они запрашивали, был раздел с фотографиями, куда все гости могли пойти после свадьбы и загрузить свои снимки. Я сказал, что это была звездная идея, и пошел строить ее.

Ну, есть только одна проблема: логистика. Скорость загрузки медленная, а фотографии с современных камер огромные (2-5+ мегабайт).

Мне понадобятся только изображения шириной ~ 800px, и для некоторых из них может потребоваться поворот, поэтому в идеале я собираюсь использовать редактор на стороне клиента, чтобы сделать три вещи:

  1. Разрешить пользователям выбирать несколько файлов
  2. Позвольте им вращать некоторые изображения, чтобы они были на правильном пути
  3. Измените их размер и затем загрузите

А в мире моей мечты это было бы бесплатно и с открытым исходным кодом. Есть идеи?

Просто напоминание: это то, что гости должны использовать. Некоторые из них будут хорошо разбираться в компьютерах, а другие будут почти полностью неграмотны. Установка настольных приложений на самом деле не вариант. И я предполагаю, что в 98% из них установлены Flash и Java.

Редактировать: Я бы предпочел вариант Flash / Java, а не SilverLight, не в последнюю очередь потому, что сейчас у него меньшая скорость установки, но также потому, что я нахожусь на Linux и хотел бы проверить его =)

Ответы [ 20 ]

4 голосов
/ 16 сентября 2008

Мне повезло с Галерея . Он бесплатный, с открытым исходным кодом и имеет все функции, которые вы упомянули.

Это позволит вашим пользователям загружать фотографии без какого-либо вмешательства с вашей стороны.

4 голосов
/ 16 сентября 2008

Другим вариантом может быть предоставление пользователям возможности загружать свои фотографии в любой используемый им сервис (flickr, google, smugmug или любой другой) и просто принимать имя пользователя для этого сервиса или URL-адрес для папки. ,

Затем ваше приложение может получить копию этих изображений для локального хранения с согласованным интерфейсом.

4 голосов
/ 28 сентября 2008

Наиболее распространенным решением для этого является Java-апплет, хотя большинство из них не являются бесплатными. Примеры:

3 голосов
/ 16 сентября 2008

Я довольно часто использовал swfupload. Это довольно круто: http://www.swfupload.org/

2 голосов
/ 16 сентября 2008

Я бы использовал апплет. Вы можете изменить размер изображения и повернуть его на стороне клиента.

Похоже, JUpload может сделать это для вас.

2 голосов
/ 16 сентября 2008

Если вы делаете это с 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), а затем загрузить на сайт пользователя с помощью RSS-каналов Flickr или API:

http://www.flickr.com/help/picnik/

http://www.flickr.com/services/api/

надеюсь, это поможет ...

микрофонные камеры

mesh@adobe.com

1 голос
/ 17 сентября 2008

Зависит от веб-сервера. Если вы можете использовать сервлеты, попробуйте это:

// 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 голос
/ 17 сентября 2008

Прохождение маршрута Flickr легко и будет работать хорошо.

Если вы хотите пойти дальше, я бы порекомендовал snipshot или picknik (Flickr использует его) Оба бесплатны и имеют API для использования.

1 голос
/ 16 сентября 2008

Вы также можете отправить фотографии по электронной почте в Picasa. В сети Picasa есть функция, с помощью которой вы можете отправлять изображения на «секретное» электронное письмо, которое будет публиковать их в учетной записи Picasa. Создайте учетную запись Picasa, разошлите «секретный» адрес электронной почты и дождитесь появления всех фотографий.

1 голос
/ 16 сентября 2008

Вы можете использовать Silverlight или Flash или какой-либо пользовательский плагин, чтобы разрешить управляемые загрузки, где вы можете, например, отображать индикатор выполнения. Вы ничего не можете сделать со скоростью загрузки, но вы можете, по крайней мере, показать их прогресс, пока он идет.

Я не знаю ни одной консервативной программы загрузки, которую вы можете использовать, но ее не должно быть слишком сложно (если вы не знаете Flash или Silverlight).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...