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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Struts. Как ограничить размер загружаемого файла? Ограничение размера загружаемого файла. 
:(
    Опции темы
iluvatar
Дата 17.9.2007, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Доброго времени суток, господа.
  Столкнулся с одной проблемокой, но официальная документация не помогла. 
  В проекте использую Struts. Есть форма, через которую в форму с клиента грузится картинка. Как можно ограничить размер загружаемой картинки? При этом хочется чтобы файл не грузился, а сначала просто проверялся его размер.
  Почитав документацию нашел, что в файле struts-config.xml можно прописать строчку
Код

  <controller processorClass="org.apache.struts.action.RequestProcessor" maxFileSize="50K"/>

  Однако, это работает на все action'ы. А если я захочу на следующей форме задать другой размер?
  В общем, вопрос открыт. 
  Заранее благодарю за умные советы.

Добавлено через 5 минут и 33 секунды
  И еще: только что проверил, оказывается если прописать контроллер, то все равно сначала файл грузится, а потом уже проверяется на размер.
PM MAIL ICQ   Вверх
Tony
Дата 17.9.2007, 20:41 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

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



Сделай зак4ку 4ерез сервлет. А не 4ерез струтс action.


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
iluvatar
Дата 18.9.2007, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



  А можно поподробнее?

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


Опытный
**


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

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



  В общем, выяснилось, что Struts 1 этого не умеет:
тынц

  Возможно кто-то подскажет, как проверить размер файла через сервлет не скачивая его на сервер?
PM MAIL ICQ   Вверх
Tony
Дата 18.9.2007, 11:10 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

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



Цитата(iluvatar @ 18.9.2007,  10:15)
В общем, выяснилось, что Struts 1 этого не умеет:
тынц

  Возможно кто-то подскажет, как проверить размер файла через сервлет не скачивая его на сервер?

Это не возможно сделать. Файл сна4ала зака4ивается на сервер в Temp директорию, а то;ько потом сервлет решает 4то с ним делать. Для аплода тебе надо Jakartа FileUpload. На форуме несколько раз уже осуждали.

Добавлено через 3 минуты и 59 секунд
Хотя я бы сделал на твоём месте так. В струтсе поставил бы max razmer каторуй ты хо4еш высылать. И создал бт интерфейс с клю4ами типа:
public static final long LITTEL_FILE= 12...;
public static final long NORMAL_FILE= 19...;
И потом в акшене проверял бы FormFile на размер исползуя ети клю4и из интерфейса.

Это сообщение отредактировал(а) Tony - 18.9.2007, 11:11


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
iluvatar
Дата 18.9.2007, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



  Да но тогда если клиент даст мне файл размера, скажем, 10 Гб он мне сервер поломает, а я не хочу чтобы мой сервер был сломан. Нужна защита от подобных случаев.
  Сейчас же проверка на размер прописана в <controller>. И все работает, только проверка на размер происходит ПОСЛЕ скачивания на сервер.

Это сообщение отредактировал(а) iluvatar - 18.9.2007, 11:21
PM MAIL ICQ   Вверх
Tony
Дата 18.9.2007, 11:21 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

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



Ну так если у тебя в аппликации надо максимум 10 метров то и поставь 10 метров в струтсе а остальные все в интерфейс.


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
iluvatar
Дата 18.9.2007, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



  Что-то слабо понимаю о чем речь. Можно поподробнее?  smile 

  Возможно, подобная опция есть в настройках tomcat'a. Может, кто-нибудь знает?

Это сообщение отредактировал(а) iluvatar - 18.9.2007, 13:10
PM MAIL ICQ   Вверх
iluvatar
Дата 18.9.2007, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нашел как реализовать на PHP:
http://www.krasland.ru/lib/index.php?id=show&aid=292
PM MAIL ICQ   Вверх
iluvatar
Дата 25.9.2007, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



  Нашел в сети замечательную по описаниям штуку - uploadbean1.7. 
  Однако не могу приконнектить к проекту. Кто-нибудь пользовался ей? 
  В строке 
Код

<jsp:useBean id="upBean" scope="page" type="javazoom.upload.UploadBean" >
  <jsp:setProperty name="upBean" property="folderstore" value="/home/liventseva" />

  IDEA видит класс UploadBean, однако при попытке загрузить страницу с клиента вылезает серия ошибкок:
Код

Generated servlet error:
/home/liventseva/jakarta-tomcat-5.0.28/work/Catalina/localhost/board/org/apache/jsp/WEB_002dINF/jsp/upload1_jsp.java:6: package javazoom.upload does not exist
import javazoom.upload.*;
 smile 

Никак не могу понять в чем дело. Однако, судя по описанию uploadBean способен решить возникшую у меня проблему.

Это сообщение отредактировал(а) iluvatar - 25.9.2007, 08:36
PM MAIL ICQ   Вверх
Tony
Дата 25.9.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

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



нету пакета:  package javazoom.upload does not exist

Добавлено через 4 минуты и 25 секунд
Вообще меня етот вопрос заинтерсовал. Т.к еть время покавираюсь.  smile 



--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
iluvatar
Дата 25.9.2007, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



  Значит, начну по порядку. 
  Например, на странице есть input для закачки файла на сервер (картинка, текст, аватар, mp3...). Собственно выполняется довольно просто - форма, инпут и т.д. Но есть проблема - как узнать размер файла ДО закачки на сервер (чтобы трудоголик-сервер не качал гигабайты, а потом, проверяя файл говорил - неверный размер). В файле struts-config.xml есть опция 
Код

<controller processorClass="org.apache.struts.action.RequestProcessor" maxFileSize="4M"/>


  Однако, это проверка на размер ПОСЛЕ закачивания на сервер.

  На бескрайних просторах гугл-нета я набрел на Upload Bean. 
  Устанавливается просто - просто копируем jar-файлы в папку "WEB-INF/lib". Есть несколько примеров работы. 

  Насколько я понял принцип работы, делаем так:
  1. В нашем jsp-файле с формой не меняем НИЧЕГО.
  2. В jsp-файл, на который переходим из формы (<form action="next.jsp") вставляем следующие строки:
импорт классов:
Код

<%@ page import="javazoom.upload.*" %>
<%@ page import="java.util.*" %>


меппинг обработки:
Код

<jsp:useBean id="upBean" class="javazoom.upload.UploadBean" scope="request" >
    <jsp:setProperty name="upBean" property="folderstore" value="/home/liventseva" />
    <jsp:setProperty name="upBean" property="parser" value="<%= MultipartFormDataRequest.CFUPARSER %>"/>
    <jsp:setProperty name="upBean" property="parsertmpdir" value="/home/liventseva"/>
    <jsp:setProperty name="upBean" property="maxfiles" value="<%= FileUploader.MAX_FILES_TO_UPLOAD-2 %>"/>
</jsp:useBean>


и алгоритм обработки, например:
Код

    <%
        if (MultipartFormDataRequest.isMultipartFormData(request)) {
            // Uses MultipartFormDataRequest to parse the HTTP request.
            MultipartFormDataRequest mrequest = new MultipartFormDataRequest(request);
            String todo = null;
            if (mrequest != null) todo = mrequest.getParameter("todo");
            if ((todo != null) && (todo.equalsIgnoreCase("upload"))) {
                Hashtable files = mrequest.getFiles();
                if ((files != null) && (!files.isEmpty())) {
                    UploadFile file = (UploadFile) files.get("file");
                    if (file != null) out.println("<li>Form field : uploadfile" + 
                                                               "<BR> Uploaded file : " + file.getFileName() + " (" + file.getFileSize() + " bytes)" + 
                                                               "<BR> Content Type : " + file.getContentType());
                    // Uses the bean now to store specified by jsp:setProperty at the top.
                    upBean.store(mrequest, "file");
                } else {
                    out.println("<li>No uploaded files");
                }
            } else out.println("<BR> todo=" + todo);
        }
    %>

 
  Таким образом, переходя на следующую jsp выполняется код обработки (3), в которой и выполняются все проверки. Если я где-то неправ, поправьте меня.

  Чем плохи примеры - все они переходят на ту же страницу, с которой начинались. А вот что делать если я хочу сначала выполнить какой-нибудь action? Ведь перефдя на него, я стану грузить файл? 
  Может кто-нить подскажет?

Это сообщение отредактировал(а) iluvatar - 25.9.2007, 13:53
PM MAIL ICQ   Вверх
Tony
Дата 25.9.2007, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

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



Код

Фильтр
public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain chain) throws IOException, ServletException {
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        ProgressListener progressListener = new ProgressListener(){
           public void update(long pBytesRead, long pContentLength, int pItems) {
              if (pContentLength > 10485760){
               int i = 1/0;
              }
           }
          
        };
        upload.setProgressListener(progressListener);

            try{
                upload.parseRequest((HttpServletRequest)arg0);
                chain.doFilter(arg0, arg1);
            }catch(Exception e){
                e.printStackTrace();
            }
        
    }

Проводя тесты полу4илось сделать только для сервлета. ЕСли променять контоллер , то работать не будет. ПРименая контоллер полу4ается вот 4то. Сна4ала орабатывает фильтр в катором проверяем размер. Если больше то еррор. Если нет то переда4а идёт дальше на контоллер. Так вот контоллер полу4ает бин с полями null (поля в бине). Может для струтса экшена прокатит не знаю. Коне4но можно попробывать AbstractContрoller t.k я использовал SimpleFormController. Я думаю там прокатит. Тоесть фильтр убрать а втавить в контоллер аплоад листенер и перека4ать файл. Вот. smile 


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
iluvatar
Дата 25.9.2007, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



  Если фильр выдаст ошибку, поизойдет полный релоад страницы. А если я этого не хочу?
Цитата(Tony @  25.9.2007,  14:17 Найти цитируемый пост)
Тоесть фильтр убрать а втавить в контоллер аплоад листенер и перека4ать файл. Вот. smile  

Объясни поподробнее, плиз.

Это сообщение отредактировал(а) iluvatar - 25.9.2007, 14:43
PM MAIL ICQ   Вверх
Tony
Дата 25.9.2007, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

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



Код

Если фильр выдаст ошибку, поизойдет полный релоад страницы. А если я этого не хочу?

А что мешет вставить форму в iframe ?
Код

Объясни поподробнее, плиз.

Я имелл виду испольозовать AbstractContoller, но это в спринге. Т.к у тебя Струтс возми сервлет и вставь туда этото код. Сегодня но4ью(постараюсь) я запощю результат (полный код,когда математику сделаю  smile )



--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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