Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Exception при работе с commons-fileupload 1.1 / 12 сообщений из 12, страница 1 из 1
02.03.2006, 21:48
    #33578444
J-Pro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exception при работе с commons-fileupload 1.1
Ребята, такая проблема: надо позволить юзеру аплоадить файл на мой сервер. Поискал по форуму, везде линки на 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
02.03.2006, 23:22
    #33578523
М.Голованов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exception при работе с commons-fileupload 1.1
Уберите

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

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
03.03.2006, 11:15
    #33579301
М.Голованов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exception при работе с commons-fileupload 1.1
А зачем вообще этот код:

Код: 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
03.03.2006, 11:32
    #33579387
J-Pro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exception при работе с commons-fileupload 1.1
М.ГоловановА зачем вообще этот код:

Код: 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
03.03.2006, 11:37
    #33579408
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exception при работе с commons-fileupload 1.1
Просто сохрани картинку на жесткий диск, где то в пределах домашней директории сайта (т. е. не в БД). А в БД храни путь к картинке или ее имя (папка куда ее сохранил и так известна).
В тэг IMG указываешь относительный путь, заданый от домашней директории.
...
Рейтинг: 0 / 0
03.03.2006, 11:57
    #33579494
J-Pro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exception при работе с commons-fileupload 1.1
KachalovПросто сохрани картинку на жесткий диск, где то в пределах домашней директории сайта (т. е. не в БД). А в БД храни путь к картинке или ее имя (папка куда ее сохранил и так известна).
В тэг IMG указываешь относительный путь, заданый от домашней директории.

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

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


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

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

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


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