java.lang.NoClassDefFoundError: java.rmi.server.UI

2019-03-03 01:46发布

I developing a web application using GWT where i am trying to upload a file . My servlet is working fine.

but when i use DiskFileItemFactory() it gives me error.

if some one can correct my code or tell what is missing in code.

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

         response.setContentType("text/plain"); 
        FileItem uploadItem = getFileItem(request); 
        if (uploadItem == null) { 
          response.getWriter().write("NO-SCRIPT-DATA"); 
          return; 
        } 
        byte[] fileContents = uploadItem.get(); 
        //TODO: add code to process file contents here. We will just print 

                    response.getWriter().write(new String(fileContents)); 
}

private FileItem getFileItem(HttpServletRequest request) {
    // TODO Auto-generated method stub
    FileItemFactory factory = new DiskFileItemFactory(); 
    ServletFileUpload upload = new ServletFileUpload(factory); 
    try { 
      List items = upload.parseRequest(request); 
      Iterator it = items.iterator(); 
      while (it.hasNext()) { 
        FileItem item = (FileItem) it.next(); 
        if (!item.isFormField() 
            && "uploadForm".equals(item.getFieldName())) { 
          return item; 
        } 
      } 
    } catch (FileUploadException e) { 
      return null; 
    } 
    return null;
} 

ERROR

 java.lang.NoClassDefFoundError: java.rmi.server.UID is a restricted class. Please see the Google  App Engine developer's guide for more details.
at com.google.appengine.tools.development.agent.runtime.Runtime.reject(Runtime.java:51)
at org.apache.commons.fileupload.disk.DiskFileItem.<clinit>(DiskFileItem.java:109)
at org.apache.commons.fileupload.disk.DiskFileItemFactory.createItem(DiskFileItemFactory.java:199)
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:361)
at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
at com.server.FileUpload.getFileItem(FileUpload.java:101)
at com.server.FileUpload.doPost(FileUpload.java:48)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)

Edited: Working Code

    try {
            ServletFileUpload upload = new ServletFileUpload();
            response.setContentType("text/plain"); 


            FileItemIterator iterator = upload.getItemIterator(request);

            while (iterator.hasNext()) {
                FileItemStream item = iterator.next();

                InputStream stream = item.openStream();

                if (item.isFormField()) {
                    log.warning("Got a form field: " + item.getFieldName()  + " " +item);



                } else{
                    log.warning("Got an uploaded file: " + item.getFieldName() +
                              ", name = " + item.getName());
                    int len;
                    byte[] buffer = new byte[8192];
                    while ((len = stream.read(buffer, 0, buffer.length)) != -1) {

                      response.getOutputStream().write(buffer, 0, len);

                    }

                }

            }
    } catch (FileUploadException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

1条回答
迷人小祖宗
2楼-- · 2019-03-03 02:01

You cannot use RMI in GAE - if you want something similar, take a look at this question.

But from your code it doesn't seem you need to use RMI at all - why are you using it? Ain't you just going to process and store it somewhere?

If you are going to store large files (up to 32MB), use the Blobstore API.

If you know you'll only have files <1MB, you can store them using JDO/JPA and a normal Entity that contains a Blob - this option will also allow you to easily pre-process the data.

查看更多
登录 后发表回答