问题与多部分/表单数据 [英] Issue with multipart/form-data

查看:164
本文介绍了问题与多部分/表单数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我的表单包含multipart / form-data时,我无法从servlet中的文件和文本输入中获取值。我正在使用apache.commons.fileuploads上传帮助。有什么建议么。同样在下面的代码中,有些东西我觉得应该更有效率。有没有更好的方法来将这些多个文件存储在数据库中。

  public void performTask(javax.servlet.http.HttpServletRequest请求,javax.servlet.http.HttpServletResponse响应)
{
boolean promo = false;
数据库db = new Database();
主页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;
尝试{
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.getName()!=)hp.setMainImg1(item.getName()) ; (item.getFieldName()。equals(mainimg2))
{
if(item.getName()!=)hp.setMainImg2(item .getName()); (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());
尝试{
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()); ()item.getFieldName()。equals(promoimg2))
{
if(item.getName() !=)
{
hp.setPromoImg2(item.getName());
尝试{
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()); (item.getFieldName()。equals(promoimg3))
{
if(item.getName() !=)
{
hp.setPromoImg3(item.getName());
尝试{
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);


解决方案当使用 multipart / form -data ,正常的输入字段值不是 request.getParameter()可用的,因为标准的Servlet API事先到版本3.0没有内置的设施来解析它们。这正是Apache Commons FileUpload存在的原因。您需要检查 FileItem#isFormField()是否返回 true ,然后从的FileItem

现在你忽略了代码中的那些值。不可否认的是, FileItem 是一个误导性的名字,如果是我,我会把它称为 MultipartItem 或者只是部分代表 multipart / form-data body的一部分,它包含上传的字段和正常的参数。 b
$ b

下面是一个启发式的例子,您应该如何正确解析 multipart / form-data 请求:

 列表< FileItem> items = new ServletFileUpload(new DiskFileItemFactory())。parseRequest(request); 
for(FileItem item:items){
if(item.isFormField()){
//在这里处理普通字段。
System.out.println(Field name:+ item.getFieldName());
System.out.println(Field value:+ item.getString());
} else {
// Process< input type =file>这里。
System.out.println(Field name:+ item.getFieldName());
System.out.println(Field value(file name):+ item.getName());






$ b注意你也忽略了一个MSIE的错误行为,沿文件名的完整客户端路径。你可以按照 item.getName()
FileUpload常见问题

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


I am not able to get values from both files and text input in a servlet when my form includes multipart/form-data. I am using the apache.commons.fileuploads for help with the uploads. Any suggestions. Also in the code below there are some things that I feel should be more efficient. Is there a better way to store these multiple files in a 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);

解决方案

When using multipart/form-data, the normal input field values are not available by request.getParameter() because the standard Servlet API prior to version 3.0 doesn't have builtin facilities to parse them. That's exactly why Apache Commons FileUpload exist. You need to check if FileItem#isFormField() returns true and then gather them from the FileItem.

Right now you're ignoring those values in the code. Admittedly, the FileItem is a misleading name, if it was me, I'd called it MultipartItem or just Part representing a part of a multipart/form-data body which contains both uploaded fields and normal parameters.

Here's a kickoff example how you should parse a multipart/form-data request properly:

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 overlooked a MSIE misbehaviour that it sends the full client side path along the file name. You would like to trim it off from the item.getName() as per the FileUpload FAQ:

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

这篇关于问题与多部分/表单数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆