首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在服务器端的GXT GWT中从本地计算机获取文件内容?(com.sencha.gxt.ui.GXT)

如何在服务器端的GXT GWT中从本地计算机获取文件内容?(com.sencha.gxt.ui.GXT)
EN

Stack Overflow用户
提问于 2015-09-07 23:03:19
回答 1查看 1.1K关注 0票数 2

我有GXT GWT项目(<inherits name='com.sencha.gxt.ui.GXT'/>)。我需要上传文件从计算机和获取字节数组的文件。

我在客户端写了上传文件,一切都很好,但是我需要添加服务器部分来获取文件的内容,怎么做呢?我的客户端:

代码语言:javascript
复制
public class FileUpload implements IsWidget {

    private static FileUploadUiBinder fileUploadUiBinder = GWT.create(FileUploadUiBinder.class);

    @UiTemplate("FileUpload.ui.xml")
    interface FileUploadUiBinder extends UiBinder<Component, FileUpload> {
    }

    @UiField
    FileUploadField uploadedFile;

    private FieldLabel label;

    @Override
    public Widget asWidget() {
        if (label == null) {
            label = (FieldLabel) fileUploadUiBinder.createAndBindUi(this);

            uploadedFile.addChangeHandler(new ChangeHandler() {
                @Override
                public void onChange(ChangeEvent event) {
                    Info.display("File Changed", "You selected " + uploadedFile.getValue());

                    }
                });
            }
            return label;
        }
    }

FileUpload.ui.xml

代码语言:javascript
复制
        <!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
        <ui:UiBinder
                xmlns:form="urn:import:com.sencha.gxt.widget.core.client.form"
                xmlns:gxt="urn:import:com.sencha.gxt.widget.core.client"
                xmlns:ui='urn:ui:com.google.gwt.uibinder'
                xmlns="urn:import:com.sencha.gxt.widget.core.client.container"

                <form:FieldLabel>
                    <form:widget>
                        <form:FileUploadField ui:field="uploadedFile" name="metadataFile"/>
                    </form:widget>
                </form:FieldLabel>

        </ui:UiBinder>

所以:我需要添加服务器部分:如何在服务器部分中获取字节数组(文件内容)?我需要一个例子:)也许有人给我提供了工作例子的链接?请帮帮我。

EN

回答 1

Stack Overflow用户

发布于 2015-09-10 14:36:32

不幸的是,为了展示一些如何将文件数据发送到服务器端的示例,您的代码需要做很多更改。我应该提一下,这只是一种可能的解决方案。不过,这里的客户机-服务器请求将发送到HttpServlet,而不是通过标准的GWT RPC。以下是我的更改:

1)更改FileUpload.ui.xml:

代码语言:javascript
复制
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:form="urn:import:com.sencha.gxt.widget.core.client.form"
    xmlns:gxt="urn:import:com.sencha.gxt.widget.core.client"
    xmlns:ui='urn:ui:com.google.gwt.uibinder'
    xmlns="urn:import:com.sencha.gxt.widget.core.client.container"
>
    <form:FormPanel>
        <form:FieldLabel>
            <form:widget>
                <form:FileUploadField ui:field="uploadedFile"
                    name="metadataFile" />
            </form:widget>
        </form:FieldLabel>
    </form:FormPanel>
</ui:UiBinder>

2)更改FileUpload.java:

代码语言:javascript
复制
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiTemplate;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Widget;
import com.sencha.gxt.widget.core.client.Component;
import com.sencha.gxt.widget.core.client.event.SubmitCompleteEvent;
import com.sencha.gxt.widget.core.client.form.FileUploadField;
import com.sencha.gxt.widget.core.client.form.FormPanel;
import com.sencha.gxt.widget.core.client.info.Info;

public class FileUpload implements IsWidget {

    private static FileUploadUiBinder fileUploadUiBinder = GWT.create(FileUploadUiBinder.class);

    @UiTemplate("FileUpload.ui.xml")
    interface FileUploadUiBinder extends UiBinder<Component, FileUpload> {
    }


    @UiField
    FileUploadField uploadedFile;

    private FormPanel formPanel;

    @Override
    public Widget asWidget() {
        if (formPanel == null) {
            formPanel = (FormPanel) fileUploadUiBinder.createAndBindUi(this);

            formPanel.setEncoding(FormPanel.Encoding.MULTIPART);
            formPanel.setMethod(FormPanel.Method.POST);
            formPanel.setAction("file.upload");  // This action should
            // point to servlet registered in WEB_INF/web.xml
            formPanel.addSubmitCompleteHandler(new SubmitCompleteEvent.SubmitCompleteHandler() {
                public void onSubmitComplete(SubmitCompleteEvent event) {
                    String resultHtml = event.getResults();
                    Info.display("Upload Response", resultHtml);
                }
            });

            uploadedFile.addChangeHandler(new ChangeHandler() {
                @Override
                public void onChange(ChangeEvent event) {
                    Info.display("File Changed", "You selected " + 
                            uploadedFile.getValue());
                    formPanel.submit();  // It's better to do it by 
                    // clicking on submitting button or something. 
                }
            });
        }
        return formPanel;
    }
}

3) web.xml (只添加parts,不使用home.test.uploadtest,使用自己的包):

代码语言:javascript
复制
<... other servlet blocks ...>
<servlet>
    <servlet-name>fileUploadServlet</servlet-name>
    <servlet-class>home.test.uploadtest.server.FileUploadServlet</servlet-class>
</servlet>   

<... other servlet-mapping blocks ...>
<servlet-mapping>
    <servlet-name>fileUploadServlet</servlet-name>
    <url-pattern>/file.upload</url-pattern>
</servlet-mapping> 

4) FileUploadServlet.java (主要是服务器端操作的虚拟示例):

代码语言:javascript
复制
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

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/plain");
        File tempDir = new File(System.getProperty("java.io.tmpdir"));
        FileItemFactory factory = new DiskFileItemFactory(1000000, tempDir);
        ServletFileUpload upload = new ServletFileUpload(factory);
        File target = null;
        try {
            try {
                List<?> items = upload.parseRequest(request);
                Iterator<?> it = items.iterator();
                while (it.hasNext()) {
                    FileItem item = (FileItem) it.next();
                    if (item.isFormField()) {
                        throw new ServletException("Unsupported non-file property [" + 
                                item.getFieldName() + "] with value: " + item.getString());
                    } else {
                        target = File.createTempFile("temp_", ".data", tempDir);
                        item.write(target);
                        item.delete();
                        System.out.println("Temp file: " + target.getAbsolutePath());
                    }
                }
            } catch (ServletException e) {
                throw e;
            } catch (Exception e) {
                throw new IllegalStateException(e);
            }
            response.getWriter().write("File length: " + target.length());
            response.getWriter().close();
        } finally {
            if (target != null && target.exists())
                target.delete();
        }
    }   
}

因此,正如您所看到的,存在对https://commons.apache.org/proper/commons-fileupload/的依赖

PS:我认为由于代码太多,我可能会忘记一些东西。在这种情况下,请让我知道。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32441618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档