在 GWT 中将文件和 HashMap 发送到服务器

Posted

技术标签:

【中文标题】在 GWT 中将文件和 HashMap 发送到服务器【英文标题】:Sending File and HashMap to server in GWT 【发布时间】:2012-08-22 11:02:51 【问题描述】:

我必须将文件及其属性发送到 GWT 服务器。

为了发送文件,我使用了表单面板。

 public class BrowseFile extends DialogBox 
   // more code
   // ..

        private FormPanel getFormPanel() 
                if (formPanel == null) 
                    formPanel = new FormPanel();
                    formPanel.setMethod(FormPanel.METHOD_POST);

                    formPanel.setEncoding(FormPanel.ENCODING_MULTIPART);
                    formPanel.setAction(GWT.getHostPageBaseURL() +"UploadFileServlet");

                    formPanel.addSubmitHandler(new FormPanel.SubmitHandler()
                        public void onSubmit(SubmitEvent event) 
                            // TODO Auto-generated method stub
                                    setFilename(fileUpload.getFilename());
                        

                    );
                
                return formPanel;
            
           

这个文件的所有属性都在Hashmap中

有2个对话框Propertybox extends DialogBox

BrowseFile extends DialogBox

在PropertyBox的构造函数里面有BrowseFile

当PropertyBox构造函数时

                setSize("600px", "670px");
    sethtml("Add Document");

    setWidget(getVerticalPanel());
    browseFile = new BrowseFile();

PropertyBox里面的自定义Property取决于选择的类(Class是tree Widget)

在服务器端

public class FileUpload extends HttpServlet implements Servlet

    private static final long serialVersionUID = 1L;
    private static final Logger log = Logger.getLogger(FileUpload.class
            .getName());
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException 

        doPost(request, response);

    

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

        byte[] buffer = new byte[115200];//
        String fileName = null;
        String mimetype = null;
        String majorVersion = null;
        InputStream stream = null;

        try 

            ServletFileUpload upload = new ServletFileUpload();

            FileItemIterator iterator = upload.getItemIterator(request);
            while (iterator.hasNext()) 
                FileItemStream item = iterator.next();
                 stream = item.openStream();

                if (item.isFormField()) 
        //                                                                      
                 else 

                    fileName = item.getName();
                    mimetype = item.getContentType();

//                                      
                
            

         catch (Exception e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        int len;

        while ((len = stream.read(buffer, 0, buffer.length)) != -1) 
            output.write(buffer, 0, len);
        
        ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
        Session session =RootFolder.getSession();
        ContentStream contentStream = session.getObjectFactory()
                .createContentStream(fileName, output.size(), mimetype, input);



为了在外部存储库中创建文档,我需要 hasmap 中的文档属性

folder.createDocument(Document Property,contentStream, VersioningState.MAJOR);

文档属性应在文档属性类的Button ADDonClick 事件上发送到此类

*****如何在 FileUpload 类中将此文档属性发送到服务器 *****

【问题讨论】:

【参考方案1】:

首先,我推荐使用 GWTUploader 组件,它让生活轻松很多。

http://code.google.com/p/gwtupload/

接下来,您需要将哈希图(键/值)添加为表单字段,请参阅

http://code.google.com/p/gwtupload/issues/detail?id=8

并简单地检索服务器端组件上的表单字段,类似于您描述的方式:

            if (item.isFormField()) 
    //                                                                      
             else 

它可能看起来像:

            if (item.isFormField()) 
               paramsMap.add(item.getName(), item.getValue())
             else 

【讨论】:

可以有更多的 200 个属性。这些属性取决于为文档选择的类。文档类有 50 多个。所以将 hashMap 添加为表单字段不是一个好的选择,而且 hasmap 的值部分是具有 3 个变量(值、数据类型)的类。 @NewCodeLearner 我不明白为什么不能将表单字段添加到请求中 - 毕竟,它是多部分数据,因此它可以处理(几乎)无限数量的字段。跨 HashMap.entrySet 的枚举并不是什么大问题。我可以建议将 HashMap 序列化为一些二进制流,然后将其作为原始数据发送 - 但这有点骇人听闻,我敢打赌你不想要这个。您为每种类型的文件动态创建字段,在客户端将它们编组为一组表单字段并在服务器上解组,将 HashMap 与文件一起获取,仅此而已。说得通?如果不是 - 请解释原因。 嘿,我在编程方面不是很好,对此知之甚少。我会试试你说的。然后我会告诉你我是否想要同样的东西。谢谢。 @NewCodeLearner 欢迎您,如果您有任何问题 - 请拍。 :我认为这行不通。因为 HasHMap 不是 。 HashMap 的类型是 这个类有 3 个参数。我必须在 gui 上显示的是这个类的键名和一个参数。我必须发送的是整个 HashMap 。如果我对剩余的两个参数使用隐藏的小部件。在ServerSide上创建hashMap或者关联参数非常困难。【参考方案2】:

为什么不使用请求序列?

    客户端:上传文件。 使用 FormPanel。 服务器:保存文件并返回新的fileId(如果成功)

    客户端:(来自 onSubmitCompleted)将文件的数据连同其 fileId 一起发送。 使用您需要的任何数据结构 服务器:将文件信息字段存储到数据库中。

【讨论】:

:新字段是什么意思。如何退货。你能举个小例子吗? 这是新文件 ID,而不是我消息中的“字段”

以上是关于在 GWT 中将文件和 HashMap 发送到服务器的主要内容,如果未能解决你的问题,请参考以下文章

使用 GWT RPC 序列化在 POST 中将对象从客户端发送到服务器

在 GWT-RPC 中将 ArrayList 作为参数发送

在eclipse中将GWT应用程序部署到tomcat

GWT,修改使用 InputStreamReader 和 java.net.URL 类通过 Post 发送 HashMap 或其他对象的代码?

如何将文件从小程序发送到 gwt 服务器?

在 GWT 中从服务器向客户端发送文件