【问题标题】:File Uploading with Servlets? [duplicate]使用 Servlet 上传文件? [复制]
【发布时间】:2011-05-10 10:10:24
【问题描述】:

注意:

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

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

在控制台中我只得到 ​​p>

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;");
            }
        }
    }
}
}

任何建议将不胜感激。

谢谢!

【问题讨论】:

    标签: java servlets file-upload


    【解决方案1】:

    有两个问题:

    首先,您需要为该字段提供name。然后就变成了请求参数名。

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

    其次,您需要按照commons fileupload guide处理else情况下FileItem#isFormField()的文件上传。您的代码当前忽略它们并且只执行 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

    您还需要记住,这种方法会覆盖任何以前上传的同名文件。您可能需要为文件名添加自动生成的后缀。

    另见:

    【讨论】:

    • 您的答案就像一个存储库。我在您提供的链接中看到了您的答案。我一个一个看了一下cmets。最后最后一条评论拯救了我的一天。是的,我也忘了在input 元素中添加name 属性。谢谢大佬!!
    • 还有if else。在阅读您的答案之前,我不知道这一点。再次感谢。
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-01
      • 2016-12-12
      • 2013-04-10
      • 2014-03-04
      • 2013-12-09
      • 2012-02-10
      • 2017-10-06
      • 2014-12-04
      相关资源
      最近更新 更多