Java 带Servlet的GWT文件上传

Java 带Servlet的GWT文件上传,java,servlets,file-upload,gwt,Java,Servlets,File Upload,Gwt,我尝试制作一个非常简单的GWT应用程序:用户可以选择一个txt文件并将其上传到服务器。稍后我想实现更多功能,但目前我仍停留在文件上载上: 在客户端,我使用了以下代码: public class GwtDemoProject implements EntryPoint { private static final String UPLOAD_ACTION_URL = GWT.getModuleBaseURL() + "upload"; private FormPanel form; priva

我尝试制作一个非常简单的GWT应用程序:用户可以选择一个txt文件并将其上传到服务器。稍后我想实现更多功能,但目前我仍停留在文件上载上:

在客户端,我使用了以下代码:

public class GwtDemoProject implements EntryPoint {

private static final String UPLOAD_ACTION_URL = GWT.getModuleBaseURL() + "upload";

private FormPanel form;
private Label info;
private FileUpload fileupload;
private Button uploadFileBtn;

public void onModuleLoad() {

    init();

    uploadFileBtn.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            String filename = fileupload.getFilename();

            if(filename.length() == 0) {
                Window.alert("File Upload failed");
            } else if(filename.endsWith(".txt")) {

                form.submit();

            } else {
                Window.alert("File is not a txt-file");
            }
        }
    });     

    form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() {
        @Override
        public void onSubmitComplete(SubmitCompleteEvent event) {

            if(event.getResults().length() == 0) {

            } else {
                Window.alert(event.getResults());
            }
        }
    });


    VerticalPanel vp = new VerticalPanel();
    vp.add(info);
    vp.add(fileupload);
    vp.add(new HTML("<br>"));
    vp.add(uploadFileBtn);

    form.add(vp);
    RootPanel rp = RootPanel.get();
    rp.add(form);
}

private void init() {
    form = new FormPanel();
    form.setAction(UPLOAD_ACTION_URL);
    form.setEncoding(FormPanel.ENCODING_MULTIPART);
    form.setMethod(FormPanel.METHOD_POST);

    info = new Label("Wähle eine Textdatei aus");

    fileupload = new FileUpload();

    uploadFileBtn = new Button("Upload File");
}
}
公共类GwtDemoProject实现入口点{
私有静态最终字符串UPLOAD\u ACTION\u URL=GWT.getModuleBaseURL()+“UPLOAD”;
私人表格小组表格;
自有品牌信息;
私人文件上传;
私有按钮上传文件BTN;
moduleload()上的公共void{
init();
uploadFileBtn.addClickHandler(新的ClickHandler(){
@凌驾
公共作废一次点击(点击事件){
String filename=fileupload.getFilename();
如果(filename.length()==0){
Window.alert(“文件上传失败”);
}else if(filename.endsWith(“.txt”)){
表单提交();
}否则{
警告(“文件不是txt文件”);
}
}
});     
form.addSubmitCompleteHandler(新的FormPanel.SubmitCompleteHandler(){
@凌驾
SubmitComplete上的公共无效(SubmitCompleteTEvent事件){
if(event.getResults().length()==0){
}否则{
alert(event.getResults());
}
}
});
VerticalPanel vp=新的VerticalPanel();
副总裁添加(信息);
副总裁添加(文件上传);
vp.add(新HTML(“
”); vp.add(上传文件BTN); 添加表格(vp); RootPanel rp=RootPanel.get(); rp.add(表格); } 私有void init(){ form=新的FormPanel(); 表单.setAction(上传操作URL); form.setEncoding(FormPanel.ENCODING\u MULTIPART); form.setMethod(FormPanel.METHOD_POST); 信息=新标签(“Wähle eine Textdatei aus”); fileupload=新建fileupload(); uploadFileBtn=新建按钮(“上载文件”); } }
在我的服务器端,我做了以下工作:

public class FileUploadServlet extends HttpServlet
{

private static final long serialVersionUID = 1L;

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html");       

    try {
        DiskFileItemFactory factory = new DiskFileItemFactory();            

        ServletFileUpload upload = new ServletFileUpload(factory);


        List<FileItem> items = upload.parseRequest(request);

        Iterator<FileItem> iter = items.iterator();
        while (iter.hasNext()) {
            FileItem item = iter.next();

            File uploadedFile = new File("C:\\samplePath\\"+item.getName()+".txt");
            item.write(uploadedFile);

        }


    } catch (Exception exc) {

    }
}
}
公共类FileUploadServlet扩展了HttpServlet
{
私有静态最终长serialVersionUID=1L;
@凌驾
受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
response.setContentType(“text/html”);
试一试{
DiskFileItemFactory=新的DiskFileItemFactory();
ServletFileUpload upload=新的ServletFileUpload(工厂);
列表项=upload.parseRequest(请求);
迭代器iter=items.Iterator();
while(iter.hasNext()){
FileItem=iter.next();
File uploadedFile=新文件(“C:\\samplePath\\”+item.getName()+”.txt”);
item.write(上传文件);
}
}捕获(异常exc){
}
}
}
在web.xml中,我向servlet添加了以下内容:

 <!-- Servlets -->
    <servlet>
        <servlet-name>uploadServlet</servlet-name>
        <servlet-class>de.gwt.demo.server.FileUploadServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>uploadServlet</servlet-name>
        <url-pattern>/gwtdemoproject/upload</url-pattern>
    </servlet-mapping>

上传servlet
de.gwt.demo.server.FileUploadServlet
上传servlet
/GWTDemo项目/上传

我没有收到任何错误消息,但我发现Servlet中的列表是空的,因此while循环永远不会执行。请求或提交有问题吗?

我对代码做了一些更改: 我更改了应用程序布局:我添加了一个文本区域,显示上传的txt文件的内容。现在,这个非常简单的应用程序将一个txt文件上传到服务器,并保存。然后服务器读取txt文件并将内容发送到客户端,然后删除保存的文件

主要变化:

我给文件上传起了一个名字:

public class GwtFileUploadDemo implements EntryPoint {

private static final String UPLOAD_ACTION_URL = GWT.getModuleBaseURL() + "upload";

private FormPanel form;
private Label info;
private FileUpload fileupload;
private Button uploadFileBtn;
private TextArea outputText;

public void onModuleLoad() {

    init();

    uploadFileBtn.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            String filename = fileupload.getFilename();

            if(filename.length() == 0) {
                Window.alert("File Upload failed");
            } else if(filename.endsWith(".txt")) {

                form.submit();          

            } else {
                Window.alert("File is not a txt file");
            }
        }
    });


    form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() {
        @Override
        public void onSubmitComplete(SubmitCompleteEvent event) {

            if(event.getResults().length() == 0) {
                Window.alert("Something went wrong - Try again");
            } else {
                outputText.setText(event.getResults());                 
            }
        }
    });


    VerticalPanel vp = new VerticalPanel();
    vp.add(info);
    vp.add(fileupload);
    vp.add(new HTML("<br>"));
    vp.add(uploadFileBtn);
    vp.add(outputText);

    form.add(vp);
    RootPanel rp = RootPanel.get();
    rp.add(form);
}

private void init() {
    form = new FormPanel();
    form.setAction(UPLOAD_ACTION_URL);
    form.setEncoding(FormPanel.ENCODING_MULTIPART);
    form.setMethod(FormPanel.METHOD_POST);

    info = new Label("Choose a txt file");

    fileupload = new FileUpload();

    //Here I added a name to the fileuploader
    fileupload.setName("uploader");

    uploadFileBtn = new Button("Show content of txt File");

    outputText = new TextArea();
    outputText.setEnabled(false);
}
}
公共类GwtFileUploadDemo实现入口点{
私有静态最终字符串UPLOAD\u ACTION\u URL=GWT.getModuleBaseURL()+“UPLOAD”;
私人表格小组表格;
自有品牌信息;
私人文件上传;
私有按钮上传文件BTN;
私有文本区域输出文本;
moduleload()上的公共void{
init();
uploadFileBtn.addClickHandler(新的ClickHandler(){
@凌驾
公共作废一次点击(点击事件){
String filename=fileupload.getFilename();
如果(filename.length()==0){
Window.alert(“文件上传失败”);
}else if(filename.endsWith(“.txt”)){
表单提交();
}否则{
警告(“文件不是txt文件”);
}
}
});
form.addSubmitCompleteHandler(新的FormPanel.SubmitCompleteHandler(){
@凌驾
SubmitComplete上的公共无效(SubmitCompleteTEvent事件){
if(event.getResults().length()==0){
Window.alert(“出错-重试”);
}否则{
outputText.setText(event.getResults());
}
}
});
VerticalPanel vp=新的VerticalPanel();
副总裁添加(信息);
副总裁添加(文件上传);
vp.add(新HTML(“
”); vp.add(上传文件BTN); vp.add(输出文本); 添加表格(vp); RootPanel rp=RootPanel.get(); rp.add(表格); } 私有void init(){ form=新的FormPanel(); 表单.setAction(上传操作URL); form.setEncoding(FormPanel.ENCODING\u MULTIPART); form.setMethod(FormPanel.METHOD_POST); 信息=新标签(“选择txt文件”); fileupload=新建fileupload(); //在这里,我为文件上传程序添加了一个名称 setName(“上传程序”); uploadFileBtn=新建按钮(“显示txt文件的内容”); outputText=新文本区域(); outputText.setEnabled(假); } }
在服务器端的Servlet中,我添加了一个检查,检查解析列表是否为空。 我使用路径、名称和文件路径创建文件。然后我用BufferedReader读取文件,并在响应中写入上下文:

public class FileUploadServlet extends HttpServlet
{

private static final long serialVersionUID = 1L;

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {      

    System.out.println("Inside doPost");

    try {
        if (!ServletFileUpload.isMultipartContent(request)) {                                 
            throw new FileUploadException("error multipart request not found");              
        }       

        DiskFileItemFactory factory = new DiskFileItemFactory();            

        ServletFileUpload upload = new ServletFileUpload(factory);

        List<FileItem> items = upload.parseRequest(request);

        if (items == null) {            
            response.getWriter().write("File not correctly uploaded");
            return;
        }

        Iterator<FileItem> iter = items.iterator();

        while (iter.hasNext()) {
            FileItem item = iter.next();
            System.out.println("Start writing File");

            String uploadPath = ".";
            String fileName = new File(item.getName()).getName();
            String filePath = uploadPath + File.separator + fileName;

            System.out.println("File-Pfad:" + filePath);        

            File uploadedFile = new File(filePath);
            item.write(uploadedFile);               

            String content = "";  

            FileReader fileReader = new FileReader(filePath);

            BufferedReader bufferedReader = new BufferedReader(fileReader);

            String line = null;

            while((line = bufferedReader.readLine()) != null) {
                content = content + line + "\n";
            }   

            bufferedReader.close();  

            PrintWriter out = response.getWriter();
            response.setHeader("Content-Type", "text/html");
            out.println(content);
            out.flush();
            out.close(); 

            uploadedFile.delete();

            System.out.println("Finished reading File");
        }

    } catch (Exception exc) {
        exc.printStackTrace();
        PrintWriter out = response.getWriter();
        response.setHeader("Content-Type", "text/html");
        out.println("Error");
        out.flush();
        out.close();
    }
    System.out.println("FileUploadServlet doPost end");
}
}
公共类FileUploadServlet扩展了HttpServlet
{
私有静态最终长serialVersionUID=1L;
@凌驾
受保护的void doPost(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
System.out.println(“内部doPost”);
试一试{
如果(!ServletFileUpload.isMultipartCont