使用Servlet进行文件上传?

3

注意:

在阅读此问题及其答案之前,请检查您的输入元素是否具有name属性。

我正在尝试使用servlet上传文件。Eclipse控制台没有显示任何错误。但是文件未能上传。对我来说,似乎一切都很好。但是我在某个地方犯了错误。

在控制台中,我只得到了

Inside Servlet //Printed by code
Items: [] // Printed by Cdoe

HTML 代码:

<form action="ImageUploadServlet" method="post" enctype="multipart/form-data">
<table>
<tr>
  <td><label>Select Image: </label></td>
  <td><input type="file" id="sourceImage" /></td>
   <tr>
        <td colspan="3">
         <input type="submit" value="Upload"/><span id="result"></span>
        </td>
      </tr> 
</table>
</form>

Servlet 代码:

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

    boolean isMultiPart = ServletFileUpload.isMultipartContent(request);
    System.out.println("Inside Servlet");
    if(!isMultiPart){
        System.out.println("Form type is not multipart/form-data");
        System.out.println("File Not Uploaded");
    }
    else
    {
        FileItemFactory dfit = new DiskFileItemFactory();
        ServletFileUpload sfu = new ServletFileUpload(dfit);
        List aList = null;

        try {
            aList = sfu.parseRequest(request);
            System.out.println("Items: "+aList);
        } 
        catch (FileUploadException fue) 
        {
            fue.printStackTrace();
        }

        Iterator itr = aList.iterator();
        while(itr.hasNext())
        {
            FileItem fi = (FileItem) itr.next();
            if(fi.isFormField())
            {
                System.out.println("File Name: "+fi.getFieldName());
                System.out.println("File Size: "+fi.getSize());

                try 
                {
                    File f = new File("D:/MyUploads/", fi.getName());
                    fi.write(f);
                } 
                catch (Exception e) 
                {
                    e.printStackTrace();
                }
            }
            else
            {
                System.out.println("It's Not Form Item;");
            }
        }
    }
}
}

感谢您的建议。

谢谢!

2个回答

9

有两个问题:

第一,你需要给该字段一个name。这将成为请求参数的名称。

<input type="file" id="sourceImage" name="sourceImage" />

其次,在FileItem#isFormField()else情况下,您需要按照commons fileupload指南处理文件上传。目前,您的代码忽略了它们并仅进行sysout操作。

if (item.isFormField()) {
    // Process regular form field (input type="text|radio|checkbox|etc", select, etc).
    String fieldname = item.getFieldName();
    String fieldvalue = item.getString();
    // ... (do your regular form field processing job here)
} else {
    // Process form file field (input type="file").
    String fieldname = item.getFieldName();
    String filename = FilenameUtils.getName(item.getName());
    // ... (do your uploaded file job here)
    File file = new File("D:/MyUploads/", filename);
    item.write(file);
}

请注意,您需要使用FilenameUtils#getName()来提取文件名,因为MSIE浏览器会错误地将完整的客户端文件路径发送到文件名中。另请参阅Commons FileUpload FAQ
您还需要记住,这种方法会覆盖任何先前上传的具有相同名称的文件。您可能想要向文件名添加自动生成的后缀。
另请参阅:

你的回答就像一个知识库。我在你给出的链接中看到了你的回答。我逐个查看了评论。最后一个评论解决了我的问题。是啊,我也忘记在input元素中添加name属性了。谢谢你! - user405398
还有那个 if else。在阅读了您的答案之前,我不知道它是什么。再次感谢。 - user405398


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接