有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多部分/formdata的java问题

当我的表单包含多部分/表单数据时,我无法从servlet中的文件和文本输入中获取值。我正在使用apache。平民fileuploads以获取有关上载的帮助。任何建议。另外,在下面的代码中,我觉得有些东西应该更有效。是否有更好的方法将这些多个文件存储在数据库中

public void performTask(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
    {
        boolean promo = false;
        Database db = new Database();
        Homepage hp = db.getHomePageContents();

        String part = ParamUtils.getStringParameter(request, "part", "");
        if(part.equals("verbage"))
        {
            String txtcontent = (String)request.getParameter("txtcontent");
            String promoheader = (String)request.getParameter("promoheader");
            String promosubheader = (String)request.getParameter("promosubheader");
            hp.setBodyText(txtcontent);
            hp.setPromoHeader(promoheader);
            hp.setPromoSubHeader(promosubheader);
            System.err.println(txtcontent);
        }
        else
        {

            boolean isMultipart = ServletFileUpload.isMultipartContent(request);
            if (!isMultipart) 
            {

            }
            else {
                FileItemFactory factory = new DiskFileItemFactory();
                ServletFileUpload upload = new ServletFileUpload(factory);
                List items = null;
                try {
                items = upload.parseRequest(request);
                //System.err.print(items);
                } catch (FileUploadException e) {
                e.printStackTrace();
                }

                Iterator itr = items.iterator();
                while (itr.hasNext()) {
                    FileItem item = (FileItem) itr.next();
                    if(item.getFieldName().equals("mainimg1"))
                    {
                        if(item.getName() !="") hp.setMainImg1(item.getName());
                    }
                    if(item.getFieldName().equals("mainimg2"))
                    {
                        if(item.getName() !="") hp.setMainImg2(item.getName());
                    }
                    if(item.getFieldName().equals("mainimg3"))
                    {
                        if(item.getName() !="") hp.setMainImg3(item.getName());
                    }
                    if(item.getFieldName().equals("promoimg1"))
                    {
                        promo = true;
                        if(item.getName() !="")
                        {
                            hp.setPromoImg1(item.getName());
                            try {
                                File savedFile = new File("/Library/resin-4.0.1/webapps/ROOT/images/promoImg1.jpg");
                                item.write(savedFile);
                                //System.err.print(items);
                            } catch (Exception e) {
                                    System.err.println(e.getMessage());
                            }
                        }
                    }
                    if(item.getFieldName().equals("promoimg2"))
                    {
                        if(item.getName() !="") 
                        {
                            hp.setPromoImg2(item.getName());
                            try {
                                File savedFile = new File("/Library/resin-4.0.1/webapps/ROOT/images/promoImg2.jpg");
                                item.write(savedFile);
                                //System.err.print(items);
                            } catch (Exception e) {
                                    System.err.println(e.getMessage());
                            }
                        }
                    }
                    if(item.getFieldName().equals("promoimg3"))
                    {
                        if(item.getName() !="")
                        {
                            hp.setPromoImg3(item.getName());
                            try {
                                File savedFile = new File("/Library/resin-4.0.1/webapps/ROOT/images/promoImg3.jpg");
                                item.write(savedFile);
                                //System.err.print(items);
                            } catch (Exception e) {
                                    System.err.println(e.getMessage());
                            }
                        }
                    }


                    System.err.println("FNAME =" + item.getFieldName() + " : " + item.getName());
                    if (item.isFormField()) {
                    } 
                    else {
                        try {
                            if(!promo)
                            {
                                String itemName = item.getName();
                                File savedFile = new File("/Library/resin-4.0.1/webapps/ROOT/images/"+itemName);
                                item.write(savedFile);
                            }
                            //System.err.print(items);
                        } catch (Exception e) {
                                System.err.println(e.getMessage());
                          }
                    }
                }
            }
        }


        db.updateHomePageContent(hp);

共 (2) 个答案

  1. # 1 楼答案

    我过去也有过类似的问题。我能找到解决这个问题的唯一方法就是将文件上传转换成它自己的形式

  2. # 2 楼答案

    使用multipart/form-data时,request.getParameter()无法使用正常的输入字段值,因为版本3.0之前的标准Servlet API没有内置工具来解析这些值。这正是Apache Commons FileUpload存在的原因。您需要检查FileItem#isFormField()是否返回true,然后从FileItem收集它们

    现在您正在忽略代码中的那些值。诚然,FileItem是一个误导性的名称,如果它是我,我会将其称为MultipartItem或只是Part表示multipart/form-data体的一部分,它包含上传的字段和正常参数

    下面是一个如何正确解析multipart/form-data请求的开始示例:

    List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
    for (FileItem item : items) {
        if (item.isFormField()) {
            // Process normal fields here.
            System.out.println("Field name: " + item.getFieldName());
            System.out.println("Field value: " + item.getString());
        } else {
            // Process <input type="file"> here.
            System.out.println("Field name: " + item.getFieldName());
            System.out.println("Field value (file name): " + item.getName());
        }            
    }
    

    请注意,您还忽略了一个MSIE错误行为,即它沿文件名发送完整的客户端路径。您希望按照FileUpload FAQitem.getName()中修剪它:

    String fileName = item.getName();
    if (fileName != null) {
        filename = FilenameUtils.getName(filename);
    }