Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка файлов - картинок на сервер 
:(
    Опции темы
magicfly
Дата 1.2.2010, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 21.2.2007

Репутация: 1
Всего: 1



1. ЭЭЭ, а каким образом они появляются в этом варе? как хранятся? Вообще как вы построите отображение так оно и будет. Если <img src="http://mySite/picture.jsp"> и ваш сервер обрабатывает подобные запросы то присоединив контроллер легко возвращать их как вам будет угодно
2. С какого диска ? С сервера ? Если кто то может стереть эти файлы то у него как минимум есть доступ (логин\пароль). Другой вопрос это backup'ы, которые можно настроить и они никак не связаны с приложением. Хотя если вам щекотно в определенных местах то никто не запрещает сохранять вам в базе 
PM MAIL   Вверх
gelo86
Дата 1.2.2010, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 388
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



Цитата(magicfly @  1.2.2010,  15:25 Найти цитируемый пост)
присоединив контроллер легко возвращать их


Сейчас я так и делаю когда надо, но просто мне неочен нравится, что я каждый раз в память гружу рисунки.
PM MAIL   Вверх
magicfly
Дата 4.2.2010, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 21.2.2007

Репутация: 1
Всего: 1



а как хотелось бы? а какие это картинки?
Вдруг их базе мульйоны а вы их кешите 
PM MAIL   Вверх
iluvatar
Дата 21.3.2010, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: 4
Всего: 4



Я подниму тему потому что у меня продолжение вопроса.
Я так понял, что картинки лучше хранить в файловой системе, а не в БД (в ней хранятся пути).
Вопроса три:
1. Я юзаю tomcat - куда он имеет доступ в ФС? Где конкретно их хранить? Можете кусочек кода для примера привести? Какие настройки есть?
2. Можно ли при загрузке как-то ограничивать размер? Посмотреть какого размера файл хочет закачать пользователь я не смогу (или таки смогу), а можно ли после загрузки файла до максимального размера рвать закачку и информировать? Наверняка же есть стандартные решения?
3. Если хранить в ФС, то как делать бекап?
PM MAIL ICQ   Вверх
MaxPayneC
Дата 22.3.2010, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Цитата(iluvatar @  21.3.2010,  22:36 Найти цитируемый пост)
Я так понял, что картинки лучше хранить в файловой системе, а не в БД (в ней хранятся пути).

Это зависит от задачи.

Цитата(iluvatar @  21.3.2010,  22:36 Найти цитируемый пост)
1. Я юзаю tomcat - куда он имеет доступ в ФС? Где конкретно их хранить?

Томкат имеет доступ в /tmp, свой темп и туда, куда вы пропишете ему доступ. Прописать права на каталог с картинками, если вы храните их в ФС - нормальная практика.

Цитата(iluvatar @  21.3.2010,  22:36 Найти цитируемый пост)
2. Можно ли при загрузке как-то ограничивать размер?

Я использовал фреймворк struts 2, там был в конфиге для этого параметр.

Цитата(iluvatar @  21.3.2010,  22:36 Найти цитируемый пост)
3. Если хранить в ФС, то как делать бекап? 

Кроном, я полагаю.
PM   Вверх
iluvatar
Дата 22.3.2010, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: 4
Всего: 4



спасибо большое, буду пробовать
PM MAIL ICQ   Вверх
iluvatar
Дата 29.3.2010, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: 4
Всего: 4



еще раз подниму тему. 
ни одного нормального плагина не нашел, придется дописывать самому.

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

Как я думаю это делать:
  в основной форме будет вспомогательная спец. для картинок, ведь иначе аяксом мы не сможем ее отправить на сервер

А теперь вопросы:
  1. как передать превью после загрузки? Я же должен отдать респонс в формате xml или json.
  2. как картинка должна передаться на сервер в основной форме?
  3. где она должна храниться после загрузки вспомогательной форме, чтобы не грузить ее по 2 раза?

Спасибо за умные ответы
PM MAIL ICQ   Вверх
iluvatar
Дата 29.3.2010, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: 4
Всего: 4



Придумал такую штуку - аяксом мы картинку грузим всерьез, она сейвится на диске, создается соотв. запись в базе. 
Назад возвращается ее id, по которому мы отображаем ее (т.е. делаем элемент с src="/getImagePreview?id=123123").
Если пользователь засабмитил основную форму, то картинке ставится флаг, что она используется (имеется в виду, столбец в БД).
Каждые скажем 12 часов запускается скрипт, который удаляет все неиспользуемые картинки.
Как вам решение? Велосипед, костыль или таки я гений?
PM MAIL ICQ   Вверх
iluvatar
Дата 31.3.2010, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: 4
Всего: 4



Цитата(MaxPayneC @ 22.3.2010,  01:21)
Цитата(iluvatar @  21.3.2010,  22:36 Найти цитируемый пост)
1. Я юзаю tomcat - куда он имеет доступ в ФС? Где конкретно их хранить?

Томкат имеет доступ в /tmp, свой темп и туда, куда вы пропишете ему доступ. Прописать права на каталог с картинками, если вы храните их в ФС - нормальная практика.

Хммм... не могу найти как tomcat'у дать доступ на папку на диске.
Подскажите конфиг
PM MAIL ICQ   Вверх
MaxPayneC
Дата 31.3.2010, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Первый способ, небезопасный

chmod 755 images
chown images tomcat:tomcat

Второй способ, более безопасный, но работает только на ext4 с включенными ACL:

setfacl -m u:tomcat:rw images
setfact -m d:u:tomcat:rw images
PM   Вверх
iluvatar
Дата 31.3.2010, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: 4
Всего: 4



кхм...
я полагал, что достаточно добавить что-то в context.xml, т.е. это полностью в сфере томкэта
ваш вариант для unix систем, а что делать смертным пользователям windows ?

Это сообщение отредактировал(а) iluvatar - 31.3.2010, 23:31
PM MAIL ICQ   Вверх
MaxPayneC
Дата 1.4.2010, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Пользователям windows перейти на unix использовать стандартные свойства выставления привилегий - свойства-безопасность на папке, кажется.
PM   Вверх
0x00
Дата 19.4.2010, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 3.4.2006

Репутация: нет
Всего: нет



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

Код

package org.umek.bts;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
// import java.lang.*;
import java.util.*;
import java.sql.*;
// import java.net.URLDecoder;
//==============================================================================
class FileInfo{
        //----------------------------------------------------------------------
        public String filename;
        public int start_index;
        public int last_index;
        //----------------------------------------------------------------------
        public String ToTranslit(String in){
                String alpha = "абвгдеёжзиыйклмнопрстуфхцчшщьэюя ";
                String[] _alpha = { "a","b","v","g","d","e","yo","g","z","i","y","i",
                                    "k","l","m","n","o","p","r","s","t","u",
                                    "f","h","tz","ch","sh","sh","'","e","yu","ya","_"};
                in = in.toLowerCase();
                StringBuffer nname = new StringBuffer("");
                char[] chs = in.toCharArray();
                for(int i=0; i<chs.length;i++){
                    int k = alpha.indexOf(chs[i]);
                    if(k != -1){
                        nname.append(_alpha[k]);
                    }else{
                        nname.append(chs[i]);
                    }
                }
                return nname.toString();
        }
        //----------------------------------------------------------------------
        public FileInfo(String filename, int start_index, int last_index){
           this.filename = filename;
           this.start_index = start_index;
           this.last_index = last_index;
        }
        //----------------------------------------------------------------------
        public void SaveFile (byte[] data, String directory, String bugid){
           if (!filename.equals("NO_FILE")){
              File f = new File(directory + bugid + "_" + ToTranslit(filename));
              try{
                   FileOutputStream fos = new FileOutputStream(f);
                   int length = last_index - start_index;
                   fos.write(data, start_index, length);
                   fos.close();
              }catch(Exception ex){
                   System.out.println(ex.toString());
              }
           }
        }
        //----------------------------------------------------------------------
}
//==============================================================================
public class Upload extends HttpServlet {
        Connection conn     = null;
        Statement stm       = null;
        String SQL          = "";
        HttpSession session = null;
        // String patch = "D:\\proj1\\trunk\\web\\uploads\\";
        String patch = "C:\\apache-tomcat\\webapps\\bts\\uploads\\";
        //----------------------------------------------------------------------
        public String ToTranslit(String in){
                String alpha = new String("абвгдеёжзиыйклмнопрстуфхцчшщьэюя ");
                String[] _alpha = {"a","b","v","g","d","e","yo","g","z","i","y","i","k","l","m","n","o","p","r","s","t","u", "f","h","tz","ch","sh","sh","'","e","yu","ya","_"};
                in = in.toLowerCase();
                StringBuffer nname = new StringBuffer("");
                char[] chs = in.toCharArray();
                for(int i=0; i<chs.length;i++){
                    int k = alpha.indexOf(chs[i]);
                    if(k != -1){
                        nname.append(_alpha[k]);
                    }else{
                        nname.append(chs[i]);
                    }
                }
                return nname.toString();
        }
        //----------------------------------------------------------------------
        @Override
        public void doPost (HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
             byte[] data;
             final int size = 1024*1024;
             session = request.getSession(true);
             PrintWriter out = response.getWriter();
             ServletInputStream in = request.getInputStream();
             BufferedInputStream bf = new BufferedInputStream((InputStream)in, size);
             byte[] all_data = new byte[size];
             int b,j = 0;
             while ((b = bf.read()) != -1){
                  all_data[j] = (byte)b;
                  j++;
             }
             data = new byte[j];
             for(int i=0; i<j; i++){
                     data[i] = all_data[i];
             }
             all_data = null;
             String boundary = extractBoundary(request.getHeader("Content-Type"));
             FileInfo[] file = extractFiles(data, boundary);             
             try{
                 conn = (Connection)session.getAttribute("connect");
                 stm  = conn.createStatement();
                 for (int i=0; i < file.length; i++){                                        
                     file[i].SaveFile(data, patch, request.getParameter("bugid"));
                     if (!file[i].filename.equals("NO_FILE")){
                        SQL ="insert"; // тут запись в бд о файле
                        stm.execute(SQL);
                        stm.execute("commit");
                     }
                 }
                 stm.close();
                 out.print("<meta http-equiv=\"Refresh\" content=\"0; URL=sb?bugid="+request.getParameter("bugid")+"\">");
             }catch(SQLException ex){
                 ex.getStackTrace();
             }
        }
        //----------------------------------------------------------------------
        private String getFilename(String header){
               String filename  = "";
               header.toLowerCase();
               int index;
               if ((index = header.indexOf("filename=")) != -1){
                   int up_index = header.indexOf((int)'"',index + 1 + 9);
                   filename = header.substring(index + 9 + 1, up_index);
                   index = filename.lastIndexOf((int)'/');
                   up_index = filename.lastIndexOf((int)'\\');
                   filename = filename.substring(Math.max(index, up_index) + 1);
               }else{
                    filename = "NO_FILE";
               }
               return filename;
        }
        //----------------------------------------------------------------------
        private void extractData(FileInfo fis, String data){
           char[] ch = {'\r','\n','\r','\n'};
           String new_line = new String(ch);
           String header;
           int index = data.indexOf(new_line,2);
           if (index != -1){
                header = data.substring(0,index);
                fis.filename = getFilename(header);
                fis.start_index += index + 4;
           }
        }
        //----------------------------------------------------------------------
        private FileInfo[] extractFiles(byte[] data, String boundary){
           int i = 0, index = 0, prev_index = 0;
           String data_str = new String(data);
           Vector data_vec = new Vector();
           while((index = data_str.indexOf(boundary,index)) != -1){
              if (i != 0){
               FileInfo f_info =
                new FileInfo("NO_FILE", prev_index, index - 2);
                extractData(f_info,
                data_str.substring(prev_index,index));
                data_vec.addElement(f_info);
              }
              index += boundary.length();
              prev_index = index;
              i++;
           }
           FileInfo[] Data = new FileInfo[i-1];
           Enumeration enume = data_vec.elements();
           i=0;
           while(enume.hasMoreElements()){
                   Data[i] = (FileInfo) enume.nextElement();
                   i++;
           }
           return Data;
        }
        //----------------------------------------------------------------------
        private String extractBoundary(String str){
           int index = str.lastIndexOf("boundary=");
           String boundary = str.substring(index + 9);
           boundary = "--" + boundary;
           return boundary;
        }
        //----------------------------------------------------------------------
}

PM MAIL   Вверх
iluvatar
Дата 21.4.2010, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: 4
Всего: 4



0x00, спасибо
Правда, смутили имена методов с большой буквы
PM MAIL ICQ   Вверх
askell
Дата 21.4.2010, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 12.11.2008

Репутация: нет
Всего: нет



Цитата(gelo86 @ 1.2.2010,  09:44)
Цитата(magicfly @  27.1.2010,  18:15 Найти цитируемый пост)
например идет запрос вида <img src=http.../>


1. Часто мы создаем war, в котором должны быть рисунки. Если они появляются динамически, то после редеплоя (стераем старый и копируем новый war), все картинки теряются. Возможно както tomcat v5,v6 или jetty v6 настроить так, чтобы при теге <img src='path' /> рисунков искал не относительно распакованного war'а, а относительно савсем другой директории (даже хоть на другом диске) ?

2. Стоит ли сохранять дополнительно в базе данных рисунки ? Вдруг ктото стерет с диска фаилы ? Ето безопасно ?

А какая разница?? Нельзя ли  создать папку в webapp где будешь хранить или деплойть файлы??? а доступ будет через контекс: http://url:port/image_store/my_images.png. Ты везде будешь указывать <img src="/image_store/my_images.png"/>
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0854 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.