Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从POST请求检索jsp中的文件和参数_Jsp_Post_Parameters - Fatal编程技术网

从POST请求检索jsp中的文件和参数

从POST请求检索jsp中的文件和参数,jsp,post,parameters,Jsp,Post,Parameters,我在模态中有以下形式: <div id="sazModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="sazModalLabel" aria-hidden="true"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal

我在模态中有以下形式:

    <div id="sazModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="sazModalLabel" aria-hidden="true">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
        <h3 id="sazModalLabel">Upload a Test</h3>
      </div>
      <div class="modal-body">
       <form method=POST id='sazForm' class="form-horizontal" action="upload.jsp" enctype='multipart/form-data'>
          <div class="control-group">
            <label class="control-label" for="inputEmail">Email</label>
            <div class="controls">
              <input name="email" type="text" id="inputEmail" placeholder="Email">
            </div>
          </div>
          <div class='control-group'>
            <label class='control-label' for='inputHost'>Test Server</label>
            <div class='controls'>
                <input name="hstnme" type='text' id='inputHost' placeholder='Hostname'>
            </div>
          </div>
          <div class='control-group'>
            <label class='control-label' for='inputPort'>Port Number</label>
            <div class='controls'>
                <input name="port" type='text' id='inputPort' placeholder='Port'>
            </div>
          </div>
          <div class="control-group">
            <label class="control-label" for="fileUploadButton">Saz File</label>
            <div class="controls">
              <input name="saz" type="file" id="fileUploadButton" placeholder="Saz File"/>
            </div>
          </div>
          <div id='modalfooter'>
            <input class="btn btn-success" type='submit' id='goButton' value="Go!"/>
            <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
            </div>
        </form>
      </div>
    </div>
就这样。它显然没有得到其他输入(电子邮件、hstnme和端口)。空值来自第一个.getParameter(“hstnme”)

我认为主机名可能会受到某种保护,所以我把它改成了hstnme,运气不好。我还注意到,当我使用commons.fileupload时,所有四个参数都被制作成FileItems,但它们的值不会一起发送


如何将表单中的参数传递给jsp并正确检索它们?

我建议您使用servlet来处理帖子,有很多方法可以做到这一点,但一个简单的方法是使用库。您只需要将JAR添加到您的项目中

下面是一个以HTML格式获取信息和打印内容的示例:

@WebServlet(urlPatterns = { "/file-upload" } )
public class FileUpload extends HttpServlet
{
    @Override
    public void doPost(HttpServletRequest p_oRequest, HttpServletResponse p_oResponse) throws IOException
    {
        PrintWriter out = p_oResponse.getWriter();

        out.println("<html><body>");

        List fileItems = null;

        // Parsing field values
        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setSizeThreshold(10000000);

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

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

            // Process the uploaded file items
            Iterator i = fileItems.iterator();

            out.println("<table><tr><td>Type</td><td>Name</td><td>Value</td>");

            while(i.hasNext())
            {
                FileItem fi = (FileItem)i.next();

                out.println("<tr>");

                if(fi.isFormField())
                {
                    out.println("<td>Field</td>");
                    out.println("<td>" + fi.getFieldName() + "</td>");
                    out.println("<td>" + fi.getString() + "</td>");
                }
                else
                {
                    out.println("<td>File</td>");
                    out.println("<td>" + fi.getFieldName() + "</td>");
                    out.println("<td>" + fi.getName() + " / " + fi.getContentType() + " / " + fi.getSize() + "</td>");
                }

                out.println("</tr>");
            }

            out.println("</table>");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        out.println("</body></html>");
        out.flush();
    }
}
@WebServlet(urlPatterns={“/文件上传”})
公共类FileUpload扩展了HttpServlet
{
@凌驾
public void doPost(HttpServletRequest p_oRequest、HttpServletResponse p_oreresponse)引发IOException
{
PrintWriter out=p_oreresponse.getWriter();
out.println(“”);
List fileItems=null;
//解析字段值
DiskFileItemFactory=新的DiskFileItemFactory();
工厂。setSizeThreshold(10000000);
//创建新的文件上载处理程序
ServletFileUpload upload=新的ServletFileUpload(工厂);
//要上载的最大文件大小。
upload.setSizeMax(10000000);
尝试
{
//解析请求以获取文件项。
fileItems=upload.parseRequest(p_-oRequest);
//处理上载的文件项
迭代器i=fileItems.Iterator();
out.println(“TypeNameValue”);
while(i.hasNext())
{
FileItem fi=(FileItem)i.next();
out.println(“”);
if(fi.isFormField())
{
out.println(“字段”);
out.println(“+fi.getFieldName()+”);
out.println(“+fi.getString()+”);
}
其他的
{
out.println(“文件”);
out.println(“+fi.getFieldName()+”);
out.println(“+fi.getName()+”/“+fi.getContentType()+”/“+fi.getSize()+”);
}
out.println(“”);
}
out.println(“”);
}
捕获(例外e)
{
e、 printStackTrace();
}
out.println(“”);
out.flush();
}
}

注意
文件项fi
是包含字段信息的对象。对于该文件,您可以使用
fi.getInputStream()
fi.getString()
获取其内容,具体取决于您想要获取该文件的方式和数据量等。

以下是解决问题的方法。我已经在我的机器上进行了本地测试,它似乎可以工作:

HTML表单

<form id='sazForm' class="form-horizontal" action="upload.jsp" enctype='multipart/form-data'>
          <div class="control-group">
            <label class="control-label" for="inputEmail">Email</label>
            <div class="controls">
              <input name="email" type="text" id="inputEmail" placeholder="Email">
            </div>
          </div>
          <div class='control-group'>
            <label class='control-label' for='inputHost'>Test Server</label>
            <div class='controls'>
                <input name="hstnme" type='text' id='inputHost' placeholder='Hostname'>
            </div>
          </div>
          <div class='control-group'>
            <label class='control-label' for='inputPort'>Port Number</label>
            <div class='controls'>
                <input name="port" type='text' id='inputPort' placeholder='Port'>
            </div>
          </div>
          <div class="control-group">
            <label class="control-label" for="fileUploadButton">Saz File</label>
            <div class="controls">
              <input name="saz" type="file" id="fileUploadButton" placeholder="Saz File"/>
            </div>
          </div>
          <div id='modalfooter'>
            <input class="btn btn-success" type='submit' id='goButton' value="Go!"/>
            <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
            </div>
        </form>
<%@ page import="java.io.*,java.util.*, javax.servlet.*"%>
<%@ page import="javax.servlet.http.*"%>
<%
   System.out.println(request.getParameter("hstnme"));

   Enumeration<String> paramNames = request.getParameterNames();

   while(paramNames.hasMoreElements()) {
      String paramName = (String)paramNames.nextElement();
      System.out.print(paramName + " : ");
      String paramValue = request.getParameter(paramName);
      System.out.println(paramValue);
   }
%>

电子邮件
测试服务器
端口号
Saz文件
接近
upload.jsp

<form id='sazForm' class="form-horizontal" action="upload.jsp" enctype='multipart/form-data'>
          <div class="control-group">
            <label class="control-label" for="inputEmail">Email</label>
            <div class="controls">
              <input name="email" type="text" id="inputEmail" placeholder="Email">
            </div>
          </div>
          <div class='control-group'>
            <label class='control-label' for='inputHost'>Test Server</label>
            <div class='controls'>
                <input name="hstnme" type='text' id='inputHost' placeholder='Hostname'>
            </div>
          </div>
          <div class='control-group'>
            <label class='control-label' for='inputPort'>Port Number</label>
            <div class='controls'>
                <input name="port" type='text' id='inputPort' placeholder='Port'>
            </div>
          </div>
          <div class="control-group">
            <label class="control-label" for="fileUploadButton">Saz File</label>
            <div class="controls">
              <input name="saz" type="file" id="fileUploadButton" placeholder="Saz File"/>
            </div>
          </div>
          <div id='modalfooter'>
            <input class="btn btn-success" type='submit' id='goButton' value="Go!"/>
            <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
            </div>
        </form>
<%@ page import="java.io.*,java.util.*, javax.servlet.*"%>
<%@ page import="javax.servlet.http.*"%>
<%
   System.out.println(request.getParameter("hstnme"));

   Enumeration<String> paramNames = request.getParameterNames();

   while(paramNames.hasMoreElements()) {
      String paramName = (String)paramNames.nextElement();
      System.out.print(paramName + " : ");
      String paramValue = request.getParameter(paramName);
      System.out.println(paramValue);
   }
%>

简而言之,解决方案是:

  • 正在从表单中删除HTTP方法
  • 使用
    getParameter

希望这能有所帮助。

我同意,事实上,我后来确实使用了FileUpload(它隐藏在页面导入中,代码只是一个剪贴。但即使在这里,fi.getString()也会返回null。还有一个附带问题,我看到这么多人只是在做“迭代器I=…”没有人喜欢“迭代器I=…”?也是“for(FileItem fi:fileItems)”因为任何原因都不可接受?@tophermith116,对于迭代来说,这两种方法都有效。If
fi.getString()
返回null如果是文件,我怀疑上传错误。文件大小是多少?文件大小是80 kb。重申一下,我只是在参数上有问题,文件本身发送得很好。只是电子邮件、端口和hstnme没有被发送或接收properly@tophersmith116你需要读同样的内容y作为文件,因为一旦;被调用时,您的参数将保持为空。您只能读取一次。ServletFileUpload已经在读取,这就是为什么您在之后会得到空值,以及为什么您只需要使用
文件项
。感谢您的帮助。这很好。我正在进行重构,使其成为一个具有适当异步调用的健壮servlet。还感谢explaining无法重新分析请求。我可能会被困在那里一段时间。谢谢你的回答。它确实得到了参数名称,但超过了,我确实需要接收一个文件,所以这不会起作用。但我确实用它来检查我的参数是否被发送,Alexandre解释说我无法重新分析,因此也解决了这个问题。