在 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 ADD
的onClick
事件上发送到此类
*****如何在 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 不是为什么不使用请求序列?
客户端:上传文件。 使用 FormPanel。 服务器:保存文件并返回新的fileId(如果成功)
客户端:(来自 onSubmitCompleted)将文件的数据连同其 fileId 一起发送。 使用您需要的任何数据结构 服务器:将文件信息字段存储到数据库中。
【讨论】:
:新字段是什么意思。如何退货。你能举个小例子吗? 这是新文件 ID,而不是我消息中的“字段”以上是关于在 GWT 中将文件和 HashMap 发送到服务器的主要内容,如果未能解决你的问题,请参考以下文章
使用 GWT RPC 序列化在 POST 中将对象从客户端发送到服务器
GWT,修改使用 InputStreamReader 和 java.net.URL 类通过 Post 发送 HashMap 或其他对象的代码?