Multipart / form-data problem

I cannot get values โ€‹โ€‹from both files and text input to the servlet when my form includes multipart / form-data. I am using apache.commons.fileuploads for downloads reference. Any suggestions. Also in the code below there are some things that I think should be more efficient. Is there a better way to store these multiple files in db.

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


source to share


4 answers


When used, multipart/form-data

normal input field values โ€‹โ€‹are not available request.getParameter()

because the pre-3.0 standard API servlet does not have built-in tools to parse them. This is why Apache Commons FileUpload exists. You need to check if it returns FileItem#isFormField()

true

and then collects them from FileItem

.

You are now ignoring these values โ€‹โ€‹in your code. Admittedly FileItem

a misleading name, if it was me, I named it MultipartItem

or simply Part

representing a body part multipart/form-data

that contains both loaded fields and normal parameters.

Here's an example of how to parse the request correctly 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());
    }            
}

      

Note that you also missed a missing MSIE behavior that sends the client's full path by filename. You would like to cut it off item.getName()

according to the FileUpload FAQ :

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

      

+10


source


if (item.isFormField()) {
    // Process normal fields here.
    System.out.println("Field name: " + item.getFieldName());
    System.out.println("Field value: " + item.getString());'
}

      

this is the code to access the value of the form field, but if i have 2 fields 1 is name and the other is address



 <input type="text" name=name>
 <input type="text" name=address>

      

how to access these field values โ€‹โ€‹separately and insert into the database.

+1


source


I've had similar problems in the past. The only way I could find the problem was to upload the file to my form.

0


source


the values โ€‹โ€‹of the input text fields in multi-line html form

This guy sorted out this issue.

It was very helpful.

0


source







All Articles