2014-02-09 2 views
0

서블릿을 처음 사용합니다. 내가 뭘 하려는지 서블릿을 사용하여 내 서버에 파일을 업로드하는 것입니다 나는 서버 측에서 변경하는 파일 이름입니다 하나의 텍스트 값을 보냅니다. 문제는 아약스 게시물을 사용하여 서블릿에 양식 데이터를 제출하는 것이지만 내 서블릿에서는 request.getParameter에서 null 값을 얻게됩니다.서블릿에서 양식 값 가져 오기

이것은 내 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. 
     }); 

이것은 내 서블릿의 양식에서 값을 얻는 방법입니다. 거기에 줄 문자열 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); 
    } 
    } 

답변

2

<form/>methodPOST로 설정해야합니다. 그런 다음 서버 측에서 요청에서 입력 스트림을 가져와 데이터를 읽어야합니다. --- doPost 메서드 (http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getParameter%28java.lang.String%29)에서 수행해야합니다. 물론 많은 라이브러리가 있습니다. 아파치 출신이다.

당신은 매개 변수가 URL을 요청 연결된 곳 enctype="multipart/from-data"POST를 사용하여 (소위 QUERY_STRING로) enctype="application/x-www-form-urlencoded"에서 독특한 무엇인지 몸을 게시하는 모든 양식의 매개 변수를 추가하는 것을 기억해야합니다. 방법 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에 추가 할 수 있습니다. 그러나 코드는 나중에 파일을 업로드하므로 파일 내용에는 적용되지 않습니다. 아파치에서 ServletFileUpload를 사용할 때

, 당신은 다음 FileItem로 (이 목록의 첫 번째 요소이어야 함) fname 매개 변수를 얻을 getString과의 콘텐츠를,지도를 얻을 parseParameterMap 방법을 볼 수 있습니다. 그것은 당신이 찾고 있어야합니다 :

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!"); 
} 
+0

모두 POST입니다. 파일을 업로드 할 수는 있지만 "fname"인 텍스트 입력 값을 가져올 수 없습니다. – ksh

+0

처리하는 서블릿의'doPost' 메소드를 제공 할 수 있습니까? 또한 방금 배치 한 문서에 대한 링크를 확인하십시오. – Cromax

+0

방금 ​​doPost 메서드를 추가했습니다. 감사. – ksh

관련 문제