【问题标题】:Get form value in Servlet在 Servlet 中获取表单值
【发布时间】:2014-03-06 20:31:50
【问题描述】:

我是 servlet 的新手。我要做的是使用 servlet 将文件上传到我的服务器,同时我发送一个文本值,该文本值是要在服务器端更改的文件名。问题是我使用 ajax post 将表单数据提交给 servlet,但在我的 servlet 中,我从 request.getParameter 获取空值。

这是我的html;

$("#fileUp").html(  "<form enctype='multipart/form-data' id='uploadForm' action='" + url + "/PrjHRService/FileUpload'>"+
                        "<input name='file' id='file' type='file' size='50'>"+
                        "<input name='fname' type='text' >"+
                        "<input id='btnUpload' value='Upload' type='submit'>"+
                        //"<div id='imgLink'></div>"+
                        "</form>" );

这是我对服务器的 jquery ajax 调用;

$("#uploadForm").submit(function() {            
            var formData = new FormData($(this)[0]);
            $.ajax({
                   type: "POST",
                   url: $("#uploadForm").attr("action"),
                   data: formData, 
                   async: false,
                   success: function(data)
                   {
                       if(data.res === "true"){
                         jsi.showMsg("Uploaded Successfully");
                         $("#imgLink").html("Uploaded Successfully");
                       }else{
                         jsi.showMsg("Error Uploading");    
                       }
                   },
                   contentType: false,
                   processData: false
                 });

            return false; // avoid to execute the actual submit of the form.
        });

这就是我从 servlet 中的表单获取值的方式;在那里你会看到行 String fileExt=request.getParameter("fname");我发现 fileExt 为 null,这是我的问题。

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {
      // Check that we have a file upload request
      isMultipart = ServletFileUpload.isMultipartContent(request);
      response.setContentType("application/json");
      String fileExt=request.getParameter("fname");
      java.io.PrintWriter out = response.getWriter( );
      if( !isMultipart ){

         JSONObject o=new JSONObject();
          try {
            o.put("res", "false");
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
          out.println(o.toString());

         return;
      }
      DiskFileItemFactory factory = new DiskFileItemFactory();
      // maximum size that will be stored in memory
      factory.setSizeThreshold(maxMemSize);
      // Location to save data that is larger than maxMemSize.
      factory.setRepository(new File("c:\\temp"));

      // Create a new file upload handler
      ServletFileUpload upload = new ServletFileUpload(factory);
      // maximum file size to be uploaded.
      upload.setSizeMax( maxFileSize );

      try{ 
      // Parse the request to get file items.
      List fileItems = upload.parseRequest(request);

      // Process the uploaded file items
      Iterator i = fileItems.iterator();
      while ( i.hasNext () ) 
      {
         FileItem fi = (FileItem)i.next();
         if ( !fi.isFormField () )  
         {
            // Get the uploaded file parameters
            String fieldName = fi.getFieldName();
            String fileName = fi.getName();
            //String[] parts = fileName.split(".");
            //fileName = parts[0] + "." + parts[1];
            String contentType = fi.getContentType();
            boolean isInMemory = fi.isInMemory();
            long sizeInBytes = fi.getSize();
            // Write the file
            if( fileName.lastIndexOf("\\") >= 0 ){
               file = new File( filePath + 
               fileName.substring( fileName.lastIndexOf("\\"))) ;
            }else{
               file = new File( filePath + 
               fileName.substring(fileName.lastIndexOf("\\")+1)) ;
            }
            fi.write( file ) ;
            JSONObject o=new JSONObject();
            o.put("res", "true");
            //out.println("Uploaded Filename: " + fileName + "<br>");
            out.println(o.toString());
            //out.println("Uploaded Successfully");
         }
      }
     /* out.println("</body>");
      out.println("</html>");*/
   }catch(Exception ex) {
       System.out.println(ex);
   }
   }

【问题讨论】:

    标签: java jquery html ajax servlets


    【解决方案1】:

    如果要上传文件,&lt;form/&gt;method必须设置为POST。然后,在服务器端,您需要从请求中获取输入流并读取数据 --- 您需要在 doPost 方法 (http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getParameter%28java.lang.String%29) 中执行此操作。当然有很多图书馆可以从你那里做到这一点,例如那些来自 apache。

    您必须记住,使用 POSTenctype="multipart/from-data" 会将 所有 表单的参数添加到 POST 正文中,这与 enctype="application/x-www-form-urlencoded" 不同的是,enctype="application/x-www-form-urlencoded" 将参数连接到请求 URL(即所谓的 QUERY_STRING )。方法 getParameter 仅适用于通过 URL 发送的参数。因此,在您的情况下,您需要读取 POST 数据,对其进行解析并找出fname 的值。 POST 可能如下所示:

    -----------------------------8022333619518
    Content-Disposition: form-data; name="fname"
    
    myfilename.txt
    -----------------------------8022333619518
    Content-Disposition: form-data; name="submit"
    
    Send
    -----------------------------8022333619518--
    

    如果你手动添加一些参数到action URL,getParameter 方法会找到它。

    由于您不上传任何文件(不是吗?),您可以将enctype="application/x-www-form-urlencoded" 设置为使用getParameter,因为它将所有表单的输入添加到 URL。但是您的代码表明,您稍后会上传文件,因此它不适用于文件内容。

    当您使用来自 Apache 的 ServletFileUpload 时,您可以看到 parseParameterMap 方法,获取地图,然后获取 fname 参数(它应该是列表中的第一个元素)作为 FileItem 并使用 @ 获取其内容987654340@。它应该是您正在寻找的:

    Map<String, List<FileItem>> map = ServletFileUpload.parseParameterMap(request);
    List<FileItem> list = map.get("fname");
    if (list != null && list.size() >= 1) {
        FileItem item = list.get(0);
        System.out.println("And the winner is... " + item.getString);
    }
    else {
        System.out.println("Dammit! Still no luck!");
    }
    

    【讨论】:

    • 两者都带有 POST。我可以上传文件,但我无法获得“fname”文本输入的值。
    • 您能否提供处理它的 servlet 的 doPost 方法?另请检查我刚刚放在答案中的文档的链接。
    • 我刚刚添加了 doPost 方法。谢谢。
    • 是的,我正在上传文件的同时我正在提交文本输入。所以..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多