使用jsp el时无法将多部分数据传递给servlet

时间:2015-03-22 10:49:22

标签: java jsp servlets

我将复选框值,用户名,文件作为参数传递给使用com.orielly.servlet包中的MultipartRequest类的servlet。我在我的jsp中使用jsp el。

我的jsp是

<c:set var="currentUser" value="${currentUser}" />



<div class="container">
    <div class="panel panel-default" >
        <div class="panel-body">
            <div class="panel panel-default">
              <div class="panel-body">
                    <form action="ProcessShareFileReq?username="${currentUser}" method="post" enctype="multipart/form-data">
                        <h4>Upload file here</h4>
                        <input type="file" class="form-control" required="required" name="file" value=""/>
                        <h4 class="page header">Share with</h4>
                        <ul class="list-group">
                            <c:forEach var="request" items="${requestList}">
                                <li class="list-group-item title">
                                <input type="checkbox" name="usersList" value="${request.senderFullName}" /><strong> ${request.senderFullName} </strong>
                                </li>
                            </c:forEach>
                        </ul>
                        <label class="label" for ="description">Description(Helps other users understand the content of file)</label>
                        <textarea id="description" name="fileDescription" rows="10" cols="5"></textarea>
                        <div class="break"></div>
                        <input type="submit" class="btn btn-default pull-left" value="Upload">&nbsp;&nbsp;
                        <input type="reset" class="btn btn-default pull-left" value="Reset">
                    </form>
              </div>
            </div>
        </div>
    </div>
</div>

我的servlet

 @WebServlet("/ProcessShareFileReq")
@MultipartConfig
public class ProcessShareFileReq extends HttpServlet {
    private static final long serialVersionUID = 1L;

    private String webTempPath;

    public void init( ) {

    webTempPath= "C://BEProject/Shared";    
    //webTempPath = getServletContext( ).getRealPath("/") + "data";    
    }

    //Generates current time suitable for oracle timestamp
    private static java.sql.Timestamp getCurrentTimeStamp() {

        java.util.Date today = new java.util.Date();
        return new java.sql.Timestamp(today.getTime());

    }

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

        Connection currentCon =null;
        PreparedStatement ps = null;

        int result;


        //list of users to share with
        String[] UserList = request.getParameterValues("usersList");

        //logged-in-user's  username
        String loggedInUser = request.getParameter("username");

        //Shared file's description
        String fileDescription = request.getParameter("fileDescription");

        //adding path according to sharer's user-name
        String userPath = webTempPath + "/" + loggedInUser;



        //generate directory 
        boolean success =( new File(userPath)).mkdirs();

        //make directory 
        if(success) {
            System.out.println("Directory: " + webTempPath + " created");
        }

        //Renames file to the 'sharer_receipent_timestamp' pattern


        //Get the uploaded file with multipartRequest
        //file limit size of 50  MB

        MultipartRequest mpr = new MultipartRequest(request,userPath,50 * 1024 * 1024);

        //Database create operations.
        Enumeration enum1 = null;

        try {
            currentCon = ConnectionManager.getConnection();
            currentCon.setAutoCommit(true);

            for(int i=0;i<UserList.length;i++)
            {
                String shareFileQuery = "insert into sharedfiles values(share_seq.NEXTVAL,?,?,?,?,?)";
                ps = currentCon.prepareStatement(shareFileQuery);

                //set the values to put in the query 
                ps.setString(1, loggedInUser);
                ps.setString(2, UserList[i]);

                enum1 = mpr.getFileNames( );
                  String filename = mpr.getFilesystemName((String) enum1.nextElement());
                ps.setString(3, filename);
                ps.setString(4, fileDescription);
                ps.setTimestamp(5, getCurrentTimeStamp());

                result=ps.executeUpdate();

                if(result>0)
                {
                    System.out.println("Database updated \n");
                }
            }


        } catch (SQLException e) {
            e.printStackTrace();
        }

         response.setContentType("text/html");
         request.setAttribute("username", loggedInUser);
         RequestDispatcher rd = request.getRequestDispatcher("/SharedFilesHistory");
         rd.forward(request, response);

    }

我用@MultipartConfig注释了servlet,以便它可以处理文件参数。 但是在添加它之后,它会上升到最后一行并给出错误

java.io.IOException: Corrupt form data: premature ending
com.oreilly.servlet.multipart.MultipartParser.<init>(MultipartParser.java:207)
com.oreilly.servlet.MultipartRequest.<init>(MultipartRequest.java:223)
com.oreilly.servlet.MultipartRequest.<init>(MultipartRequest.java:110)
servlet.share.ProcessShareFileReq.doPost(ProcessShareFileReq.java:104)
javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
filter.authentication.AuthenticationFilter.doFilter(AuthenticationFilter.java:40)

当重新调用MultipartConfig时,它在for循环中给出NullPointerException,因为'UserList'为null,因为在servlet中没有从jsp接收到任何值。 请帮忙

1 个答案:

答案 0 :(得分:0)

我记得在使用MultipartRequest时遇到一些小问题(似乎与某些错误相关),这使我放弃了使用 native Servelt 3.x Part ,这对您来说可能是一个不错的选择:

doPost方法中,您可以使用其名称将您的文件检索为Part请求:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
  //...
  Part filePart = request.getPart("file"); // Retrieves <input type="file" class="form-control" required="required" name="file" value=""/>

  InputStream fileContent = filePart.getInputStream(); // Get an InputStream then let the file make its way to your storage location
}