多部分/表单数据不适用于 servlet

nic*_* m. 0 html java upload jsp

我不太确定为什么带有 enctype="multipart/form-data" 标签的 html 表单没有传递它应该传递的对象。mozilla 和 firefox 就是这种情况。

例如,对于 IE 的情况,我使用 html 控件来选择一个文件,它确实得到了它应该得到的。

现在我只想知道是否有任何替代方法可以用来通过 http 请求对象传递文件,因为 enctype="multipart/form-data" 似乎存在一些兼容性问题,但我不确定

任何建议,将不胜感激!:D

Jom*_*oos 5

首先,你必须提供一点代码来显示你做了什么,并知道出了什么问题。无论如何,我假设您必须使用 HTML 文件上传控件将文件上传到服务器。

文件上传或者说multipart/form-data编码类型支持没有在HttpServlet实现中实现。所以,request.getParameter()不要与 multipart/form-data. 您必须使用为此提供支持的其他库。Apache Commons File Upload就是一个很好的例子。他们的使用文件上传指南将帮助您开始使用该库。这是一个简单的示例(使用文件上传指南编译)。

// Check that we have a file upload request
boolean isMultipart = ServletFileUpload.isMultipartContent(request);

if (isMultipart) {
    // Create a factory for disk-based file items
    FileItemFactory factory = new DiskFileItemFactory();

    // Create a new file upload handler
    ServletFileUpload upload = new ServletFileUpload(factory);

    // Parse the request
    List /* FileItem */ items = upload.parseRequest(request);

    // Process the uploaded items
    Iterator iter = items.iterator();
    while (iter.hasNext()) {
        FileItem item = (FileItem) iter.next();

        if (item.isFormField()) {
            // Process form field.
            String name = item.getFieldName();
            String value = item.getString();
        } else {
            // Process uploaded file.
            String fieldName = item.getFieldName();
            String fileName = item.getName();
            String contentType = item.getContentType();
            boolean isInMemory = item.isInMemory();
            long sizeInBytes = item.getSize();

            if (writeToFile) {
                File uploadedFile = new File("path/filename.txt");
                item.write(uploadedFile);
            }
        }
    }
} else {
    // Normal request. request.getParameter will suffice.
}
Run Code Online (Sandbox Code Playgroud)