jsp页面中添加 enctype="multipart-formdata'无法提交到后台得解决思路

解决产品添加页面中有提交文件的解决思路

设计原则

在jsp页面的表单里面

<form action="ArticleServlet" enctype="multipart/form-data" method="post">
<input type="hidden" name="method" value="add">

<div>
 
<input type="text" name="title" id="title" value="" size="60" maxlength="200" />

</div>

后台xxxServlet中

无法通过这种方式进行后台表单数据的接收

String name = request.getparameter(title);

为什么呢?

因为在xxxServlet中 doPost() doGet()方法中没法接收到method方法!!

解决思路见图

使用装饰流设计模式包装httpServletRequest

定义这样一个类

class MultipartrequestWrapper extends HttpRequestWrapper {

  public MultipartRequestWrapper(HttpServletRequest request) {

  super(request);

//首先判断是否multipart编码类型
//如果是multipart编码类型,就逐个从request中取出各个表单域
//contentType:multipart/form-data; boundary=---------------------------317894718690
//如果表单域是普通的表单域,则将它的值取出,放到allParams中(通过表单上传到服务器是通过requestUtil.copyParam())
//如果表单域是文件,则
//1、把文件先存储到磁盘的某个目录中!
//2、把文件的有关信息(名称,类型,上传时间)包装成Attachment[]类型
//3、把包装好的Attachment[]类型,放到allParams中
//拿到迭代器

  

try {
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if(!isMultipart){
allParams = request.getParameterMap();
}else{

// Create a new file upload handler
allParams = new HashMap();
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator iter = upload.getItemIterator(request);
while(iter.hasNext()){
FileItemStream item = iter.next();//拿到表单域对象
String name = item.getFieldName();//拿到表单域的名称
//得到表单域得值(这是一个输入流)
InputStream stream = item.openStream();
//如果是普通表单域
if(item.isFormField()){
String value = Streams.asString(stream,request.getCharacterEncoding());
//此处不能直接allParams.put(name,value);如果在表单处有两个相同字段都需要保存下来,如若不保存后面会覆盖前面的
addFieldsAndValuesToMap(name, value);
}else{
//文件附件类型
if(stream.available()!=0){
//如果是ie浏览器上传就会把路径也提交上来
//而我们只需要文件名
String filename = item.getName();
if(filename!=null){
//为了解决IE上传本地文件路径问题
filename = FilenameUtils.getName(filename);//只需要文件名不需要路径
}
//3是否自动关闭
Streams.copy(stream,new FileOutputStream("D:/temp/update/"+filename), true);
Attachment attachment = new Attachment();
attachment.setContentType(item.getContentType());
attachment.setName(filename);
attachment.setUploadTime(new Date());
//如果是多个文件
addFieldsAndValuesToMap(name, attachment);
}
}

}
}
}catch (Exception e) {
e.printStackTrace();
}

}

//为了处理多个上传文件
private void addFieldsAndValuesToMap(String name, Attachment value) {
Attachment[] fieldValues = (Attachment[]) allParams.get(name);
if(fieldValues==null){
allParams.put(name, new Attachment[]{value});
}else{
//如果不为空说明map集合里面已经有一份了
//‘sex‘,‘male‘界面又传来一个表单仍然需要保存
//‘sex‘,‘male‘,null
fieldValues = Arrays.copyOf(fieldValues, fieldValues.length+1);
//再给新数组赋值
fieldValues[fieldValues.length-1]=value;//给最后一个赋值最新的value
allParams.put(name, fieldValues);//
}

}

/**
* 目标实现数组的拷贝
* @param name
* @param value
* map的键是唯一的
*/
private void addFieldsAndValuesToMap(String name, String value) {
String[] fieldValues = (String[]) allParams.get(name);
if(fieldValues==null){
allParams.put(name, new String[]{value});
}else{
//如果不为空说明map集合里面已经有一份了
//‘sex‘,‘male‘界面又传来一个表单仍然需要保存
//‘sex‘,‘male‘,null
fieldValues = Arrays.copyOf(fieldValues, fieldValues.length+1);
//再给新数组赋值
fieldValues[fieldValues.length-1]=value;//给最后一个赋值最新的value
allParams.put(name, fieldValues);//{‘sex‘,‘male‘,‘male‘}
}

}

@Override
public String getParameter(String name) {
  String[] values = (String[]) allParams.get(name);
  if(values != null){
    return values[0];
}
  return null;
}

@Override
public Map getParameterMap() {

return allParams;
}

public Map getAllParams() {
  return allParams;
}

public void setAllParams(Map allParams) {
  this.allParams = allParams;
}
}

}

如此在xxxServlet中

Attachment[] attachments = (Attachment[])request.getParameterMap().get("attachs");
if(attachments != null){
for(Attachment atta : attachments){
     System.out.println(atta.getName()+",已经被上传,文件类型是:"+atta.getContentType());
  a.addAttachments(atta);// GRASP模式中专家模式的运用
}
}

在baseServlet中悄悄得把httpServletRequest替换成MultipartServletRequest

这样在客户端的servlet就依赖于MultipartServletRequest request

@Override
public String getParameter(String name) {
  String[] values = (String[]) allParams.get(name);
  if(values != null){
    return values[0];
}
  return null;
}

@Override
public Map getParameterMap() {

return allParams;
}

jsp页面中添加 enctype="multipart-formdata'无法提交到后台得解决思路

原文地址:https://www.cnblogs.com/oldfish711/p/8185949.html

时间: 2024-12-11 15:25:54

jsp页面中添加 enctype="multipart-formdata'无法提交到后台得解决思路的相关文章

在jsp页面中添加富文本编译器(ueditor)+ 图片上传功能

一次老大让我把文本的编辑区域加一个富文本编译器,于是马上下载了一个kindEditor来试试,但后来老大推荐说百度的ueditor编译器不错,于是我便怀着扩展知识,又学到一个新东西的心理下载了百度的ueidtor编译器,整合到项目中感觉确实不错,今天就和大家分享下这个富文本编译器的使用-- 第一步:首先下载ueditor编译器,地址:http://ueditor.baidu.com/website/ 下载完解压之后就这个: 第二步:我会把文件名utf-8-jsp这个文件名改为ueditor,然后

form 表单添加 enctype =&quot;multipart/form-data&quot; 属性后后台接收中文乱码

解决办法: new String( request.getParameter("title").getBytes("ISO-8859-1"),"utf-8") ISO-8859-1 是你jsp页面默认的编码,一般新建一个jsp页面最顶端可以看到默认编码pageEncoding=

form enctype:&quot;multipart/form-data&quot;,method:&quot;post&quot; 提交表单,后台获取不到数据

在解决博问node.js接受参数的时候,发现当form中添加enctype:"multipart/form-data",后台确实获取不到数据,于是跑到百度上查了一下,终于明白为什么了,下面转载一下原因吧: 1.get方式 get方式提交的话,表单项都保存在http header中,格式是 http://localhost:8080/hello.do?name1=value1&name2=value2这样的字符串.server端通过request.getParameter是可以取

form 中Enctype=multipart/form-data 的作用

ENCTYPE="multipart/form-data"用于表单里有图片上传. <form name="userInfo" method="post" action="first_submit.jsp"    ENCTYPE="multipart/form-data">表单标签中设置enctype="multipart/form-data"来确保匿名上载文件的正确编码. 如

form &nbsp; 中 enctype=&quot;multipart/form-data&quot; 作用

<form name="userInfo" method="post" action="first_submit.jsp"    ENCTYPE="multipart/form-data"> 表单标签中设置enctype="multipart/form-data"来确保匿名上载文件的正确编码. 如下: <tr> <td height="30" align=&

form 中 Enctype=multipart/form-data 的作用

ENCTYPE="multipart/form-data"用于表单里有图片上传. 表单标签中设置enctype="multipart/form-data"来确保匿名上载文件的正确编码. 如下: <form name="userInfo" method="post" action="first_submit.php" ENCTYPE="multipart/form-data">

表单form的enctype=&quot;multipart/form-data&quot;使用疑惑

在使用表单传送数据的时候,如果form 加了enctype="multipart/form-data" 这个属性,那么表单请求传到另一个jsp或servlet 里时是不能用request.getParameter()来获取到各个表单元素的值的.可以通用这样(上传组件提供的API): boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (isMultipart) {  // Create a fa

django框架 input 文本框 单选框 多选框 上传文件 等数据传输后台的程序 request.getlist接收多个结果 obj.chunks 用于文件传输 enctype=&quot;multipart/form-data文件传输必备表头

在上一个博客中,我们学习了如果创建django,这里我们主要讲如何把数据传给后台 在url文件中, 从app01中导入views, 以及创建url(r'^login/', views.login) from django.contrib import admin from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^logi

jsp中文件上床的enctype=&quot;multipart/form-data&quot;用法

jsp表单中必须要有enctype="multipart/form-data"才能文件上传的意思,是设置表单的MIME编码.默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传:只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作. enctype="multipart/form-data"是上传二进制数据; form里面的input的值以2进制的方式传过去. form里面的