Я пытался разработать веб-приложение, которое может загружать и обрабатывать локальные файлы на сервере GAE.Я пытался сделать это с помощью виджета FileUpload, но кажется, что файл не может быть успешно загружен с помощью http-запроса.
Код на стороне клиента выглядит следующим образом
private void loadLocalDataDialog()
{
final DialogBox loadBox = new DialogBox();
loadBox.setText("Upload Local Files");
final FormPanel form = new FormPanel();
form.setWidth("275px");
form.setEncoding(FormPanel.ENCODING_MULTIPART);
form.setMethod(FormPanel.METHOD_POST);
form.setAction(GWT.getModuleBaseURL() + "FileUploadServlet");
VerticalPanel vp = new VerticalPanel();
vp.setHorizontalAlignment(VerticalPanel.ALIGN_RIGHT);
form.setWidget(vp);
final FileUpload uploader = new FileUpload();
uploader.setName("uploadlocalfile");
vp.add(uploader);
loadBox.add(vp);
loadBox.center();
HorizontalPanel buttonPanel = new HorizontalPanel();
buttonPanel.add(new Button("Cancel", new ClickHandler()
{
@Override
public void onClick(ClickEvent event)
{
// TODO Auto-generated method stub
loadBox.hide();
}
}));
buttonPanel.add(new Button("Submit", new ClickHandler()
{
@Override
public void onClick(ClickEvent event)
{
// TODO Auto-generated method stub
form.submit();
}
}));
vp.add(buttonPanel);
form.addSubmitHandler(new FormPanel.SubmitHandler()
{
@Override
public void onSubmit(SubmitEvent event)
{
// TODO Auto-generated method stub
String fileName = uploader.getFilename();
if(fileName.length() == 0)
{
Window.alert("Error: no file is selected. Please select a file to be uploaded.");
event.cancel();
}
else if(!fileName.endsWith("xml") && !fileName.endsWith("json") && !fileName.endsWith("csv"))
{
Window.alert("Error: file format not supported. Only supports XML, CSV and JSON");
event.cancel();
}
else
loadBox.hide();
}
});
form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler()
{
@Override
public void onSubmitComplete(SubmitCompleteEvent event)
{
// TODO Auto-generated method stub
Window.alert(event.getResults());
}
});
}
У меня естьЯ провел некоторые исследования в Интернете, и большинство решений, которые я нашел, сказали, что это потому, что виджет FileUpload не имеет имени.Но, как вы можете видеть, я уже установил имя виджета, поэтому я понятия не имею, что пошло не так.
А вот мой код на стороне сервера:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
@SuppressWarnings("serial")
public class FileUploadServlet extends HttpServlet
{
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
if(ServletFileUpload.isMultipartContent(request))
{
response.setContentType("text/plain");
ServletFileUpload upload = new ServletFileUpload();
InputStream is = null;
try
{
FileItemIterator iterator = upload.getItemIterator(request);
while(iterator.hasNext())
{
FileItemStream item = iterator.next();
if(item.getFieldName().equals("uploadlocalfile") && !item.isFormField())
{
is = item.openStream();
break;
}
}
if(is == null)
response.getWriter().write("No Data");
else
{
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
while((line = reader.readLine()) != null)
sb.append(line + "\n");
reader.close();
response.getWriter().write(sb.toString());
}
}
catch (FileUploadException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else
response.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, "Request contents type is not supported by the servlet.");
}
}
Неважно, какой файлЯ передал, итератор ничего не возвращает, и «No Data» всегда печатается.
Я попробовал подход ServletFileUpload.parseRequest, и это тоже не работает.
Любые идеи приветствуются!Спасибо.
Редактировать: ниже приведена часть моего файла web.xml, связанная с этой функцией
<servlet>
<servlet-name>loadLocalFile</servlet-name>
<servlet-class>com.meng.climatevisualizeapp.server.FileUploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loadLocalFile</servlet-name>
<url-pattern>/climatevisualizeapp/FileUploadServlet</url-pattern>
</servlet-mapping>
Редактировать: это может быть связано с тем, что запрос http был проанализировандважды.Но я не мог понять, где произошел первый анализ.