ローカルファイルをGAEサーバーにアップロードして処理できるWebアプリケーションを開発しようとしました。私はFileUploadウィジェットを使ってこれを達成しようとしましたが、ファイルがhttpリクエストによって正常にアップロードできなかったようです。クライアント側のコードは、このGWT FileUpload Servletがファイルの内容を取得できませんでした
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.");
}
}
は、どんなに私が転送どのファイル、イテレータは何も返さないと「データなし」は常に印刷されます。
私はServletFileUpload.parseRequestアプローチを試しましたが、どちらもうまくいきません。
アイデアありがとうございます!ありがとう。
編集:以下は、この機能
<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>
編集に関連している私のweb.xmlファイルの一部です:これは、HTTPリクエストが二回解析されたという事実に起因することができます。しかし、私は最初の解析がどこで発生したのか把握できませんでした。
ああ、私はweb.xmlファイルを設定しました。申し訳ありませんが投稿していません。私は質問を編集します。 – mpang
ご返信ありがとうございます。私は自分のプログラムを踏んだところで、要求からFileItemStreamのインスタンスが解析されていないことが判明しました。結果として、iterator.hasNext()はすぐにfalseを返します。 – mpang
サーブレットに到達したリクエストの内容は何ですか?このようなものを使用してください:Enumeration enumeration = request.getParameterNames();および/またはgetParameterValues()を参照してください。 –