powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Exception при работе с commons-fileupload 1.1
12 сообщений из 12, страница 1 из 1
Exception при работе с commons-fileupload 1.1
    #33578444
J-Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята, такая проблема: надо позволить юзеру аплоадить файл на мой сервер. Поискал по форуму, везде линки на commons-fileupload-1.1.jar. Скачал я его, подключил в JBuilder'e как библиотеку в свойствах проекта, скомпилил, компилится без ошибок, разве что с варнингами о том, что все ф-ции этой библиотеки deprecated. Не пойму почему, версия, вроде, последняя... Решил проверить аплоад по примеру, который нашёл в нете(код сервлета ниже прилагается). Но при переходе на этот сервлет вылазит exception(тоже показан ниже). Не подскажете, что я делаю не так? Может, неверно подключил библиотеку? Т.к. я пытался и через свойства JDK её подключить, скопировав в jre/lib/ext/ и прописав в свойствах ждк в жбилдере.

Знающие люди, подскажите, что я неверно делаю, может, кто сталкивался... Спасибо огромное заранее.

P.S.: Код странички, с которой перехожу на сервлет:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<FORM METHOD = "post" ACTION = "uploadfile.htm" ENCTYPE = "multipart/form-data" CLASS = "form_view_type">

<input type="hidden" name="taskID" value="13">
Upload New File: 
<INPUT TYPE = "file" NAME = "fPath">
  
<INPUT TYPE = "submit" NAME = "Submit" VALUE = "Go">

</FORM>


Код сервлета:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
 import  org.apache.commons.fileupload.DiskFileUpload;
 import  org.apache.commons.fileupload.FileItem;
 import  org.apache.commons.fileupload.FileItemFactory;
 import  org.apache.commons.fileupload.FileUpload;
 import  org.apache.commons.fileupload.FileUploadException;

 public   class  uploadfile
         extends  HttpServlet
{
    private   static   final  String CONTENT_TYPE = "text/html; charset=windows-1251";

   //Initialize global variables
    public   void  init()
            throws  ServletException
   {
   }



   //Process the HTTP Get request
    public   void  doGet(HttpServletRequest request, HttpServletResponse response)
            throws  ServletException, IOException
   {
      doPost(request, response);
   }



   //Process the HTTP Post request
    public   void  doPost(HttpServletRequest request, HttpServletResponse response)
            throws  ServletException, IOException
   {

      // taskID
       int  taskID;
       try 
      {
         taskID = Integer.parseInt(request.getParameter("taskID"));
      }
       catch (NumberFormatException e)
      {
         taskID =  0 ;
      }

      // ----------------------------------

      PrintWriter out = response.getWriter();

       try 
      {

         FileUpload fup =  new  FileUpload();
          boolean  isMultipart = FileUpload.isMultipartContent(request);
         // Create a new file upload handler

         out.println(isMultipart);
         DiskFileUpload upload =  new  DiskFileUpload();

         // Parse the request
         List items = upload.parseRequest(request);

         Iterator iter = items.iterator();
          while (iter.hasNext())
         {

            FileItem item = (FileItem)iter.next();

             if (item.isFormField())
            {
               out.println("its a field");
            }
             else 
            {
               out.println("its a file");
               out.println(item.getName());
               File cfile =  new  File(item.getName());
               File tosave =  new  File(getServletContext().getRealPath("/"), cfile.getName());
               item.write(tosave);
            }
         }

      }
       catch (Exception ex)
      {
         out.println(ex);
      }

      out.close();

   }


   //Clean up resources
    public   void  destroy()
   {
   }
}





Exception:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
exception 

javax.servlet.ServletException: Servlet execution threw an exception


root cause 

java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream
	org.apache.commons.fileupload.DefaultFileItemFactory.createItem(DefaultFileItemFactory.java: 102 )
	org.apache.commons.fileupload.FileUploadBase.createItem(FileUploadBase.java: 500 )
	org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java: 367 )
	org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java: 268 )
	main.uploadfile.doPost(uploadfile.java: 100 )
	javax.servlet.http.HttpServlet.service(HttpServlet.java: 709 )
	javax.servlet.http.HttpServlet.service(HttpServlet.java: 802 )

...
Рейтинг: 0 / 0
Exception при работе с commons-fileupload 1.1
    #33578523
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уберите

taskID = Integer.parseInt(request.getParameter("taskID"));

до вызова upload.parseRequest(request);

Вы его так не достанете - его доставать надо будет тоже из items.

Во-вторых, непонятно, чего это он ищет

org/apache/commons/io/output/DeferredFileOutputStream

В моем fileupload это класс

org/apache/commons/fileupload/DeferredFileOutputStream

Скачайте, что ли, fileupload посвежее...
...
Рейтинг: 0 / 0
Exception при работе с commons-fileupload 1.1
    #33578981
mozheyko_d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё нужно скачать commons-io , без него не будет работать.
...
Рейтинг: 0 / 0
Exception при работе с commons-fileupload 1.1
    #33579207
J-Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
М.ГоловановУберите

taskID = Integer.parseInt(request.getParameter("taskID"));

до вызова upload.parseRequest(request);

Вы его так не достанете - его доставать надо будет тоже из items.


Ок, понимаю, уберу, спасибо за совет. И постараюсь разобраться с тем, как достать аргумент из item'ов. Doc'и от fileupload я интегрировал в JBuilder.


М.ГоловановВо-вторых, непонятно, чего это он ищет

org/apache/commons/io/output/DeferredFileOutputStream

В моем fileupload это класс

org/apache/commons/fileupload/DeferredFileOutputStream

Скачайте, что ли, fileupload посвежее...

Дело в том, что скачал его только вчера. И на jakart'e было написано, что 1.1 - самая свежая версия... Вот я её и скачал. И такая трабла...

Кстати, сегодня, вот, пришёл на работу, скачал по совету mozheyko_d commons-io-1.1.jar (спасибо за линк, кстати), прописал его в свойствах проекта, запустил - всё работает. НО потом выкинул из свойств проекта эту библиотеку, пересобрал и всё равно всё работает. Даже после перезапуска tomcat'a. Чудеса, да и только...

Надеюсь, у меня полчится запихнуть полученный файл в MS SQL 2000... :) Если нет - обязательно напишу на этом форуме.



Остался ещё один вопрос: почему JBuilder при компиляции выдаёт warnings о том, что ф-ция класса FileUpload isMultipartContent, а также сaм класс DiskFileUpload являются deprecated, т.е. уже нежелательными к использованию. Что же тогда использовать?
...
Рейтинг: 0 / 0
Exception при работе с commons-fileupload 1.1
    #33579301
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем вообще этот код:

Код: plaintext
1.
2.
3.
4.
         FileUpload fup =  new  FileUpload();
          boolean  isMultipart = FileUpload.isMultipartContent(request);
         // Create a new file upload handler

         out.println(isMultipart);

Только чтобы полюбоваться на isMultipart?...

Выкиньте, и все дела.
...
Рейтинг: 0 / 0
Exception при работе с commons-fileupload 1.1
    #33579387
J-Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
М.ГоловановА зачем вообще этот код:

Код: plaintext
1.
2.
3.
4.
         FileUpload fup =  new  FileUpload();
          boolean  isMultipart = FileUpload.isMultipartContent(request);
         // Create a new file upload handler

         out.println(isMultipart);

Только чтобы полюбоваться на isMultipart?...

Выкиньте, и все дела.


Это из примера, конечно, мне он не нужен. Выкинул, но deprecated остались:

Код: plaintext
1.
2.
3.
4.
         DiskFileUpload upload =  new  DiskFileUpload();

         // Parse the request
         List items = upload.parseRequest(request);

DiskFileUpload и upload.parseRequest - пишет, что deprecated. Но всё работает. стоит ли мне закрыть на это глаза? Или же действительно надо использовать функции поновее? Какие в таком случае?


И ещё один вопрос, думаю, заключительный :)

Я прочитал как вывести картинку в ответе, в браузере. Код выглядит так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
       ....
               File cfile =  new  File(item.getName());
               File tosave =  new  File(getServletContext().getRealPath("/"), cfile.getName());
               item.write(tosave);
               
                byte [] rgb = item.get();
               
                if  (rgb !=  null )
               {

                   response.reset();
                   response.setContentType("image/jpeg");
                   response.setContentLength(rgb.length);
                   ServletOutputStream stream = response.getOutputStream();
                   stream.write(rgb);
                   stream.flush();
                   stream.close();
               }

Как закинуть её в базу - тоже примерно ясно. Надо будет использовать setBinaryStream класса CallableStatement. С получением картинки из базы тоже проблем не возникнет. Но как показать её в браузере вместе с остальным содержанием странички? Записывать временно на диск, и прописывать в теге IMG? Просто я ни разу такого не делал, хотелось бы знать оптимальный вариант сего деяния.


Спасибо огромное за столь быстрые ответы, за помощь, которая реально помогла! Приятно осознавать, что есть знающие ребята, которые всега помогут :) Спасибо ещё раз.
...
Рейтинг: 0 / 0
Exception при работе с commons-fileupload 1.1
    #33579408
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто сохрани картинку на жесткий диск, где то в пределах домашней директории сайта (т. е. не в БД). А в БД храни путь к картинке или ее имя (папка куда ее сохранил и так известна).
В тэг IMG указываешь относительный путь, заданый от домашней директории.
...
Рейтинг: 0 / 0
Exception при работе с commons-fileupload 1.1
    #33579494
J-Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KachalovПросто сохрани картинку на жесткий диск, где то в пределах домашней директории сайта (т. е. не в БД). А в БД храни путь к картинке или ее имя (папка куда ее сохранил и так известна).
В тэг IMG указываешь относительный путь, заданый от домашней директории.

Да, так бы подошло, но не для себя делаю... Дело в том, что картинки должны храниться менно в БД. В этом нет проблем, в MS SQL есть подходящий тип данных и запихнуть туда картинку не составит проблем. Но, чувствую, для того, чтобы её показывать, таки есть единственный способ: создавать временный файл на диске, а потом удалять... И в страничке ответа генерировать тэг IMG с путём ко временному файлу.

Спасибо за ответ, уважаемый Kachalov .
...
Рейтинг: 0 / 0
Exception при работе с commons-fileupload 1.1
    #33580539
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно написать сервлет, который читает картинку из базы и отправляет ее в поток вывода сервлета, формируя при этом необходимый Content-Type, например:
Код: plaintext
1.
response.setContentType("image/gif");
...
Рейтинг: 0 / 0
Exception при работе с commons-fileupload 1.1
    #33580672
J-Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KachalovМожно написать сервлет, который читает картинку из базы и отправляет ее в поток вывода сервлета, формируя при этом необходимый Content-Type, например:
Код: plaintext
1.
response.setContentType("image/gif");


А если мне, кроме картинки нужно ещё кучу информации вывести? Таблицы, текст и т.д.? Как вывести только картинку, я разобрался, действительно, можно так и сделать, как Вы пишете, я выше приводил код, но это будет страничка с одной картинкой. А мне надо несколько картинок, с описанием и т.д. Так что, пока вижу один вход - временно сохранять плюс IMG в ответе с ссылкой на временную картинку. Других вариантов нет? Всмысле, обычно так и делают? Я просто впервые этим занимаюсь... Стандартный алгоритм есть?

Спасибо.
...
Рейтинг: 0 / 0
Exception при работе с commons-fileupload 1.1
    #33581069
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
<IMG src="URI_вашего_сервлета_который_выдает_картинку">
...
Рейтинг: 0 / 0
Exception при работе с commons-fileupload 1.1
    #33584078
J-Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
М.Голованов<IMG src="URI_вашего_сервлета_который_выдает_картинку">

Cпасибо за совет, я и не знал, что один сервлет в другой вставить можно таким, вот, образом... Очень помогло.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Exception при работе с commons-fileupload 1.1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]