【发布时间】:2012-01-29 13:08:56
【问题描述】:
我尝试开发一个可以将本地文件上传和处理到 GAE 服务器的 Web 应用程序。我尝试通过使用 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 请求被解析了两次。但我不知道第一次解析发生在哪里。
【问题讨论】:
标签: java google-app-engine gwt file-upload