multipart / form-data不能与servlet一起使用

时间:2011-12-03 04:57:39

标签: java html jsp upload

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

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

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

任何建议将不胜感激! :d

2 个答案:

答案 0 :(得分:3)

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

multipart/form-data实施中未实现文件上传或HttpServlet编码类型支持。因此,request.getParameter()不适用于multipart/form-data。您必须使用其他库来为此提供支持。 Apache Commons File Upload就是一个很好的例子。他们的using fileupload指南将帮助您开始使用该库。这是一个简单的例子(使用文件上传指南编译)。

// 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.
}

答案 1 :(得分:1)

得到了它。如果其他人可能有这样的问题,这是我的问题。我为我检查了文件的内容类型,以确保传递的对象属于某种类型。在IE中,它返回application / x-zip-compressed只适用于IE,但是mozilla和chrome似乎正在为zip文件返回一个不同的内容类型,即application / octet-stream。

所以我只是将application / octet-stream添加到有效的文件类型中,它现在似乎正在工作