【问题标题】:How can I get info from a html form in JAVA without servlet?如何在没有 servlet 的情况下从 JAVA 中的 html 表单中获取信息?
【发布时间】:2016-05-14 20:25:27
【问题描述】:

我正在通过 HTML 表单上传文件:

<form class="formulario" action="validatorKenken.cgi" method="GET">
                    <input type="file" name="xml" accept="*.xml"> <br/>
                    <input type="submit">   
</form>

Java 文件被表单调用的 CGI 文件调用。 我需要将正在上传的文件保存在服务器上。

我已经看到了使用 servlet 的解决方案,但由于 import javax.servlet 不存在,我无法编译它。

我使用的是 Java 1.7.0_101

谢谢!

【问题讨论】:

    标签: java html input server cgi


    【解决方案1】:

    脚本会将CONTENT_TYPE 环境变量设置为either application/x-www-form-urlencoded or multipart/form-data。后者通常只用于带有&lt;input type=file&gt; 控件的表单。无论哪种方式,请求正文都将在标准输入中,Java 将继承该标准输入以及所有环境变量。

    由于您的表单有一个文件字段,因此内容类型将为multipart/form-data。正文将包含多部分 MIME 消息。

    如果您使用 JavaMail 实现,解析多部分 MIME 消息会容易一个数量级,因为您可以使用它的 MimeMultipart 类及其相关类:

    Path saveDir = Paths.get("/home/enery93/Downloads");
    
    // id or name attribute of HTML <input type='file'> element
    String fileInputControlName = "file";
    
    Path formDataFile = Files.createTempFile(null, null);
    Files.copy(System.in, formDataFile, StandardCopyOption.REPLACE_EXISTING);
    
    MimeMultipart formData = new MimeMultipart(
        new FileDataSource(formDataFile.toFile()));
    
    int count = formData.getCount();
    for (int i = 0; i < count; i++) {
        BodyPart part = formData.getBodyPart(i);
    
        // See HTML 4.01 spec, section 17.13.4 at
        // https://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2
        ContentDisposition disposition =
            new ContentDisposition(part.getDisposition());
        String name = disposition.getParameter("name");
    
        if (fileInputControlName.equals(name)) {
            Path saveFile = saveDir.resolve(part.getFileName());
            try (InputStream content = part.getInputStream()) {
                Files.copy(content, saveFile);
            }
            break;
        }
    }
    
    Files.delete(formDataFile);
    

    在撰写本文时,http://java.net/projects/javamail/downloads/download/javax.mail.jar 提供了完整的 javax.mail.jar。

    如果您不能或不愿意使用 JavaMail,您将不得不自己解析多部分内容,这很不愉快。

    【讨论】:

    • 我无法使用 JavaMail。那么,我该怎么办?
    • 要能够管理文件,这一行就够了吗? "字符串文件输入控件名称 = "文件";"但是如果类型是 String 并且我正在使用二进制文件,那怎么可能呢?
    • 正如我在该代码行上方的注释中指出的那样,这只是 HTML 中出现的 idname 属性的值。文件内容无关紧要。
    • 我不太明白。那么,文件的内容怎么可能无关呢?当我必须将文件保存在我的服务器中时,我无法参考,我需要文件的所有内容。它在哪里?
    • 该文件的内容是System.in 的一部分,但您不能只将 System.in 保存到文件中。这些字节是您必须解析的 MIME 多部分消息。多部分消息的每个部分都有一个名称;对于 HTML 表单提交,每个部分的名称与 HTML 表单中的 &lt;input&gt; 名称匹配。
    猜你喜欢
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 2017-06-02
    • 1970-01-01
    相关资源
    最近更新 更多