Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Копирование файла с клиента на сервер.


Автор: sergush 30.12.2005, 01:28
Пользователь на jsp-страничке выбирает файл (input type=file). Мне нужно скопировать файл на сервер. Как это можно сделать? Заранее благодарен за любую помощь.

Автор: onsh76 30.12.2005, 09:01
В Servlet API нет метода, который бы мог Вам помочь зааплодить файл.
Посему используем 3-rd party libraries, как-то:
- http://jakarta.apache.org/commons/fileupload/ ;
- Jason Hunter's MultipartRequest из http://www.servlets.com/cos . Примитивный пример сервлета смотрим; http://servlets.com/jservlet2/examples/ch04/UploadTest.java:
- если работаете со Spring framework, то смотрим как это делается http://static.springframework.org/spring/docs/1.2.x/reference/mvc.html#mvc-multipart -
( кстати спринг использует вышеуказанные библиотеки).

Автор: sergush 2.1.2006, 17:52
Спасибо onsh76. FileUpload творит чудеса.
P.S. Что такое Spring framework даже не представляю. smile

Автор: onsh76 9.1.2006, 08:37
Пожалуйста... smile
Очень рекомендую углубиться в SpringFramework... Попробуя один раз это дело, потом за уши не оттащищь!

Автор: DEMOVERSION 11.1.2006, 15:28
primer mozhesh polozut??? spasibo

Автор: sergush 12.1.2006, 15:54
Если пример использования FileUpload, то подробное описание использования (на ангельском) можно посмотреть здесь: http://jakarta.apache.org/commons/fileupload/using.html.
Мой код разбора запроса:
Код

        if(FileUpload.isMultipartContent(request)){
            try{
                FileItemFactory factory = new DiskFileItemFactory();
                ServletFileUpload upload = new ServletFileUpload(factory);
                List items = upload.parseRequest(request);
                Iterator iter = items.iterator();
                while(iter.hasNext()){
                    FileItem item = (FileItem)iter.next();
                    if(item.isFormField()){
                        String name = item.getFieldName();
                        String value = item.getString("windows-1251");
                        if(name.equals("name"))
                            ...
                        else if(name.equals("date"))
                            ...
                    } else {
                        //item содержит передаваемый файл
                        //используешь его по своему усмотрению
                        //item.write(file); - копировать в file(тип java.io.File)
                    }
                }
            } catch(FileUploadException fue){
            } catch(UnsupportedEncodingException uee){
            }
        }

Критика приветствуется.
Дальше вопрос. В FileUpload
Код

public static final boolean isMultipartContent(HttpServletRequest httpServletRequest)
объявлен устаревшим и может кто-нибудь подскажет как использовать метод
Код

static boolean isMultipartContent(RequestContext ctx).
Где взять объект, реализующий RequestContext? Если не трудно можно код привести или ссылку. Спасибо.

Автор: onsh76 15.1.2006, 10:26
Цитата(sergush @ 12.1.2006, 15:54)
...
Дальше вопрос. В FileUpload
Код

public static final boolean isMultipartContent(HttpServletRequest httpServletRequest)
объявлен устаревшим и может кто-нибудь подскажет как использовать метод
Код

static boolean isMultipartContent(RequestContext ctx).
Где взять объект, реализующий RequestContext? Если не трудно можно код привести или ссылку. Спасибо.

Ответ на первый вопрос:

Код

public static final boolean isMultipartContent(javax.servlet.http.HttpServletRequest req)

    Deprecated. Use the method on ServletFileUpload instead.


Ответ на второй:

http://jakarta.apache.org/commons/fileupload/apidocs/index.html
Код

All Known Implementing Classes:
    PortletRequestContext, ServletRequestContext 


Автор: DEMOVERSION 17.1.2006, 18:38
А DiskFileItemFactory в какой либе, его у меня с коммансами нету. спасибо

Автор: batigoal 17.1.2006, 22:59
Судя по доке, должен быть в FileUpload...

Автор: onsh76 18.1.2006, 12:01
Цитата(DEMOVERSION @ 17.1.2006, 18:38)
А DiskFileItemFactory в какой либе, его у меня с коммансами нету. спасибо

Смотрим javadoc по http://jakarta.apache.org/commons/fileupload/apidocs/org/apache/commons/fileupload/disk/DiskFileItemFactory.html:

Автор: Andrey1 20.1.2006, 13:03
Что-то я не пойму...
ServletFileUpload.isMultipartContent(request) бросается ложью на JSP страничке, хотя
посылается к ней форма:
Код

<form action="load_file.jsp" method="post" enctype="multipart/form-data">
    <input type="file" name="input" /> 
    <br />
    <input type="submit" />
</form>

Что не правильно может быть?

Об этой же (похоже) проблеме человек пишет тут: http://forums.devshed.com/java-help-9/uploading-problem-with-my-servlet-256772.html

Автор: Andrey1 20.1.2006, 14:53
Разобрался... Это там что-то в кэше растряло...

Автор: DEMOVERSION 20.1.2006, 18:52
Кто может вышлите пожалуйста свой пример мне на почту [email protected]

Или может закиньте сюда рабочий пример, например какой-то екшин????

Спасибо

Автор: Ярополкъ 28.8.2007, 23:33
Народ, помогите. Уже голову сломал себе. Не могу upload реализовать никак.  smile 
Уже начитался и на русском языке и на аглицком. Но чего-то не получается.

Вот форма посылающая запрос:
Код


<FORM name="uploadfile" ACTION="${pageContext.request.contextPath}${actpage.handle}.html" method="POST" ENCTYPE="multipart/form-data">
        <input type="file" name="ExportFile" value="">
        <input type="submit" value="Export" name="btUpload" />
</FORM>


А вот принимающая:

Код

   boolean isMultipart = ServletFileUpload.isMultipartContent(request);
   if (isMultipart){
       // Create a factory for disk-based file items
        FileItemFactory factory = new DiskFileItemFactory();

        // Create a new file upload handler
        ServletFileUpload upload = new ServletFileUpload(factory);

        // Parse the request
        List /* FileItem */ items = upload.parseRequest(request);
%>
<%=" is Empty: " + items.isEmpty()%><%



Результат последней строчки is Empty: true. Что говорит о том что реквест пришел без файла и без данных формы.
Подскажите люди добрые че делать???

Могу вот еще что добавить. 
Код


${pageContext.request.contentType}

дает резульлтат:

multipart/form-data; boundary=---------------------------317552952224136

Что правда это значит я не знаю. Мож кто подскажет. Буду благодарен за любую инфу smile 

Автор: Ярополкъ 29.8.2007, 09:06
Вчера, как чуйку поймал - не зря проблемой озадачился. Решил наконец-то проблему. Код который я приводил в прошлом посте верный. Ну, потенциально верный smile (проверить возможности не было). А проблема возникла у меня вот почему. Я работаю с MagnoliaCMS. Эти  smile сделали собственную обработку мультиформовых запросов и видимо где-то у себя в коде обнуляют мультиформовую часть реквеста,  что не позволяет обрабатывать данные обычным способом.  smile  Уродцы нифига этого не документировали. По крайней мере гуглингом найти в документации нужной информации не получилось. Пришлось ковырять исходники. Вот такая вот жесть. Надеюсь мой пост кому-нибудь в будущем сэкономит время.

Автор: ukiuki 11.4.2008, 11:53
а у мну такая проблема : необходимо зааплоадить файл с машины клиента в базу данных на сервере, использую jsp и Томкат. проверяла на локалхост, все работает, а вот при попытке  зааплоадить файл с клиента, он, видимо , продожает искаться на сервере, где томкат установлен... и выдается такая ошибка...  No such file or directory... как можно решить данную проблему, и в чем может быть причина? заранее спасибо)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)