2013-10-27 5 views
0

Вот мой код, позволяющий пользователю загрузить файл и сохранить его для дальнейшего использования. Точка class-Home.java запись имеет следующий -GWT не загружает файл

FileUpload upload = new FileUpload(); 
FormPanel fp = new FormPanel(); 
fp.setEncoding(FormPanel.ENCODING_MULTIPART); 
fp.setMethod(FormPanel.METHOD_POST); 
fp.setAction("\\UploadServlet"); 
upload.setName("file-upload"); 

Alongwith необходимого дополнительного кода для добавления в RootPanel и все.

Q1. Должно быть что-то вроде

fp.setAction(GWT.getModuleBaseURL()+"UploadServlet"); 

предпочтительнее для setAction? и какой путь нужно здесь положить?

Класс UploadServlet был взят из

http://www.tutorialspoint.com/servlets/servlets-file-uploading.htm с

String filePath = getServletContext().getInitParameter("file-upload"); 

Также файл web.xml имеет

<servlet> 
    <servlet-name>UploadServlet</servlet-name> 
     <servlet-class>com.gwt.dlogpackage.client.UploadServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>UploadServlet</servlet-name> 
    <url-pattern>/UploadServlet</url-pattern> 
</servlet-mapping> 

Q2. Теперь я не знаю, почему это не работает. Он не получает никаких файлов в классе UploadServlet. Когда я использую HTML-код для него, он работает, но не этим java-кодом. Может кто-нибудь сказать мне, почему?

Q3. И что-то вроде этого в web.xml необходимо?

<context-param> 
    <description>Location to store uploaded file</description> 
    <param-name>file-upload</param-name> 
    <param-value> C:\users\.. </param-value> 
</context-param> 
+0

Получаете ли вы какие-либо ошибки, когда они не загружаются? – enrybo

ответ

0

Посмотрите, как это выглядит ваш модуль gwt.xml:

<module rename-to='module_name'> 
... 
</module> 

Метод GWT.getModuleBaseURL() возвращает строку: "module_name". Так что, если вы набираете:

fp.setAction(GWT.getModuleBaseURL()+"UploadServlet"); 

результат:

fp.setAction("module_name/UploadServlet"); 

Так web.xml должен выглядеть следующим образом:

<servlet> 
    <servlet-name>UploadServlet</servlet-name> 
     <servlet-class>com.gwt.dlogpackage.client.UploadServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>UploadServlet</servlet-name> 
    <url-pattern>module_name/UploadServlet</url-pattern> 
</servlet-mapping> 
+0

В классе UploadServlet у него есть утверждения - DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = новый ServletFileUpload (заводская); Список fileItems = upload.parseRequest (запрос); Итератор i = fileItems.iterator(); while (i.hasNext()) FileItem fi = (FileItem) i.next(); (Но это никогда не входит в это утверждение. Почему так?) – user2327972

0

Q1

Я думаю, что

fp.setAction(GWT.getModuleBaseURL()+"UploadServlet"); 

лучше

Q2

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

Если вы удаляете FormPanel после/во время загрузки, попробуйте оставить его, пока не получите обратный вызов.Так что-то вроде:

FormPanel panel = new FormPanel(); 
... 
panel.addSubmitCompleteHandler(new SubmitCompleteHandler(){ 

    public void onSubmitComplete(SubmitCompleteEvent event){ 
     // Keep FormPanel visible until this method is called 
    } 

}): 

Q3

Я полагаю, что вам нужен web.xml, чтобы быть похожим, что учитывая то, как ваш сервер работает, но вы можете легко иметь другую реализацию без этого <param-value>...</param-value> тега.

+0

В классе UploadServlet у него есть утверждения - \t \t DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = новый ServletFileUpload (заводская); Список fileItems = upload.parseRequest (request); Iterator i = fileItems.iterator(); while (i.hasNext()) FileItem fi = (FileItem) i.next(); (Но это никогда не входит в это утверждение. Почему так?) – user2327972

+0

Вы пробовали отлаживать? Является ли сервлет даже вызванным? Какой код в сервлете запущен? – enrybo

+0

Вызывается UploadServlet, но размер файла fileItem равен 0, поэтому, возможно, upload.parseRequest (request) ничего не возвращает. Почему так?? – user2327972

0

Если у вас есть загрузка-файл сервлета объявлен так:

<servlet> 
    <servlet-name>UploadServlet</servlet-name> 
    <servlet-class>com.gwt.dlogpackage.client.UploadServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>UploadServlet</servlet-name> 
    <url-pattern>/UploadServlet</url-pattern> 
</servlet-mapping> 

Тогда вам следует написать:

fp.setAction("UploadServlet"); 

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

Могу ли я добавить предложение: если бы я был вами, я бы назвал fileUploader тем же именем, что и имя формы.

Наконец, как сказал enyrbo, прикрепите FormPanel к странице (я предполагаю, что вы закодировали обработчики onSubmit и onSubmitComplete).

+0

В классе UploadServlet у него есть утверждения - DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = новый ServletFileUpload (заводская); Список fileItems = upload.parseRequest (запрос); Итератор i = fileItems.iterator(); while (i.hasNext()) FileItem fi = (FileItem) i.next(); (Но это никогда не входит в это утверждение. Почему так?) – user2327972

+0

Нет необходимости использовать шаблон итератора, вы можете использовать для каждого утверждения каждый элемент fileItems следующим образом: for (FileItem fileItem: fileItems) {...}. Чтобы помнить об этом, добавьте этот LOC в свое время: if (item.isFormField()) continue; это потому, что вам нужны поля для файлов не просто. –

+0

Я предлагаю вам отлаживать код и помещать точку останова в параметр запроса, возможно, там что-то отсутствует, например путь к файлу в вашем FS. –

Смежные вопросы