代码之家  ›  专栏  ›  技术社区  ›  user405398

用Servlets上传文件?

  •  3
  • user405398  · 技术社区  · 15 年前

    注:

    在阅读此问题及其答案之前,请检查输入元素是否 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 回复  |  直到 15 年前
        1
  •  8
  •   Community Mohan Dere    9 年前

    有两个问题:

    首先,你需要给这个领域 name . 然后它成为请求参数名。

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

    其次,您需要在 else 案例 FileItem#isFormField() 根据 commons fileupload guide . 您的代码当前正在忽略它们并只执行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 .

    您还需要记住,此方法将覆盖以前上载的同名文件。您可能需要在文件名中添加自动生成的后缀。

    另见:

        2
  •  0
  •   duffymo    15 年前