Как лучше всего обрабатывать загрузку фотографий?

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

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

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

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

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

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

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

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

jaircazarin-old-account 01.02.2009 00:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
11
1
2 668
20
Перейти к ответу Данный вопрос помечен как решенный

Ответы 20

Picasa - отличное / бесплатное приложение для управления фотографиями. Он позволяет вам выполнять довольно впечатляющее редактирование и имеет возможности загрузки, хотя я не могу вспомнить, будет ли он загружен куда-либо или только на определенные популярные сайты (например, Flickr).

Извините, я должен был пояснить. Это для гостей, а не для меня. Некоторые из этих людей не умеют работать с компьютером = (

Oli 16.09.2008 20:40

О, вы хотите, чтобы это работало на веб-странице? За неимением лучшего слова, как апплет?

swilliams 16.09.2008 20:42

Picasa загружает только в сервис Google, picasaweb. Это по-прежнему полезно для редактирования фотографий, но вы все равно захотите иметь загрузчик, если хотите, чтобы он переходил на произвольный сайт.

zigdon 16.09.2008 20:43

Да, я ищу какой-нибудь апплет. Я пару раз редактировал основной пост, чтобы обрисовать это сейчас.

Oli 16.09.2008 20:45

Просто скажите большими буквами «встроено в веб-страницу» :-p

swilliams 16.09.2008 20:46

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

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

GIMP (http://www.gimp.org/) - хороший инструмент для изменения размера и имеет открытый исходный код.

Действительно? Ваши предложения для людей, которые "почти полностью неграмотны", - это GIMP?

swilliams 16.09.2008 20:50

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

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

Как насчет использования Фотошоп онлайн? Он позволяет редактировать фотографии с помощью веб-редактора и предлагает 2 ГБ памяти. Я сам не использовал его, поэтому не знаю, позволяет ли он нескольким пользователям получить доступ к одной и той же учетной записи, хотя

Из любопытства, на каком веб-стеке это запускать? НАПОЛЬНАЯ ЛАМПА? 2k3 + IIS? и т.д. и т.п.? Многие решения с открытым исходным кодом являются кроссплатформенными, но другие нет ...

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

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

Думаю, это самое разумное решение. На сайтах фотохостинга уже есть инструменты для изменения размера и поворота фотографий, так зачем изобретать велосипед? У Flickr есть множество возможностей для получения данных через каналы: flickr.com/services/feeds

Garrett Albright 16.09.2008 21:51

Доступен ли вариант Отправка фотографии по электронной почте?

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

Просто настройте одну учетную запись Gmail / Anymail и пусть ваш сайт будет опрашивать почтовый ящик.

Это что-то вроде того, что TwitPic делает для твиттера, но ваши требования кажутся более простыми.

Если вы делаете это с помощью 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/

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

Майк Чемберс

[email protected]

Лично большинство пользователей не понимают DPI, и их изображения, даже обрезанные, в конечном итоге оказываются больше, чем позволяет php.ini для большинства хостинговых компаний.

Я не уверен, какой контроль вы хотите им дать или как вы хотите, чтобы публичная сторона вела себя.

Я бы предложил использовать FTP-приложение dropbox, такое как http://etonica.com/dropbox/index.html (tango dropbox). Это бесплатно для ваших клиентов, и вам нужно только заплатить за свою версию, чтобы вы могли настроить информацию FTP и защитить ее.

Я бы попросил их скачать что-нибудь по ссылке paint.net (что бесплатно), чтобы они отредактировали фотографии до нужного размера, а затем просто перетащили их в это приложение. это просто и не требует изменения php.ini.

Вы также можете использовать что-то вроде приложения-директора слайд-шоу.

Я полностью согласен с zigdon, разрешаю разные сайты, но только беру фотографии из Интернета. Если вы все еще хотите разрешить загрузку и ограничить размер.

Теперь, если вы хотите заняться чем-то большим, я бы предложил ограничить размер, а затем использовать JQuery (или другую библиотеку) для работы с изображениями.

Только мои 2 цента

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

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

Похоже, Загрузить может сделать это за вас.

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

О, слава богу, чувак, это именно то, что я искал в проекте, над которым я сейчас работаю. Ты спаситель !!! Спасибо.

bryanpearson 18.09.2008 05:14

Перейти по маршруту Flickr легко и будет хорошо.

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

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

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

В настоящее время от меня требуется выполнение того же требования, что и от Оли.

Я считаю, что Facebook.com использует какой-то java-апплет, и он работает очень хорошо, но я не уверен, доступен ли апплет как OSS. Я собираюсь изучить JUpload, предложенный ScArcher2.

Если у вас нет других хороших апплетов, пожалуйста, продолжайте.

Ответ принят как подходящий

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

У меня желание JumpLoader работал на Linux. Есть ошибка (о которой я сейчас сообщил), когда он не загружается в IcedTea / OpenJDK.

Oli 02.02.2009 15:42

Вчера я отправил электронное письмо создателю JumpLoader, сегодня получил быстрый обмен сообщениями MSN, а через несколько минут появилась версия, совместимая с OpenJDK. МАГИЯ !! JumpLoader намного лучше, чем множество решений стоимостью более 50 долларов и бесплатен (с довольно свободными ограничениями).

Oli 02.02.2009 19:09

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

Mauricio Scheffer 02.02.2009 19:49

Я бы высоко предложил использовать FileBrowser от Lussomo. Это так же просто, как перетаскивание: D

Я использовал его для своей команды разработчиков игр, где у нас был необработанный дамп из более чем 200 изображений концепт-арта, и мы просто извлекли FileBrowser на веб-сервер с поддержкой PHP, скопировали изображения в соответствующие каталоги (по одному на альбом) и запустили сценарий миниатюр. Он обрабатывает кадрирование изображений и оптимизирует их размер для вас. Намного лучше, чем использовать что-то вроде Menalto Gallery, где вам нужно загружать их через неудобный интерфейс загрузки.

Другие вопросы по теме