有关上传文件的问题(java.lang.IllegalArgumentException)

limingjia198274 2007-06-18 12:01:51
我想上传文件
jsp页面的表单中:
<form id="form1" name="form1" onsubmit="return check()"
method="post" enctype="multipart/form-data" action="<%=request.getContextPath() %>/song.do">

地址:<input name="saddress" type="file" id="saddress" />

如果没有 enctype="multipart/form-data" 那么程序可以正常运行
但是 这句是上传格式必须用到的啊,我加上这句,再运行
就报异常 java.lang.IllegalArgumentException 说参数

SongForm.java内容:

private String saddress;

public String getSaddress() {
return saddress;
}
public void setSaddress(String saddress) {
this.saddress = saddress;
}
...全文
1240 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
limingjia198274 2007-06-23
  • 打赏
  • 举报
回复
songForm是我这个程序中的struts-Form
limingjia198274 2007-06-23
  • 打赏
  • 举报
回复
不好意思,这几天不在,所以没有回复大家,错误是这样的,struts接收Form中file控件传来的值,默认是String类型,而需要上传时候file传来的值是以enctype="multipart/form-data"方式,因此:

struts-form中:private String saddress 改为 private FormFile saddress;
struts-action中:
String saddress = songForm.getSaddress() 改为
FormFile saddress = songForm.getSaddress();
limingjia198274 2007-06-18
  • 打赏
  • 举报
回复
查到struts有关上传的资料了,问题解决了,哈哈~
KYO_vs_IORI 2007-06-18
  • 打赏
  • 举报
回复
学习。。。接分。。。
luyang1016 2007-06-18
  • 打赏
  • 举报
回复
如果lz使用的是struts的话,需要写一个类继承
org.apache.struts.action.RequestProcessor
主要是override,doForward这个方法就可以了。

原因参考:http://www.ojava.net/simple/index.php?t2900.html


package xxx;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.upload.MultipartRequestWrapper;


public class RequestProcessor extends org.apache.struts.action.RequestProcessor {

protected void doForward(String uri, HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
HttpServletRequest myRequest = request;
if (request instanceof MultipartRequestWrapper) {
myRequest = ((MultipartRequestWrapper) request).getRequest();
}
super.doForward(uri, myRequest, response);
}
}
yougucao379548695 2007-06-18
  • 打赏
  • 举报
回复
哥们啥原因,给大家都说说!
li_d_s 2007-06-18
  • 打赏
  • 举报
回复
jf
luyang1016 2007-06-18
  • 打赏
  • 举报
回复
struts中post方式上传文件,enctype="multipart/form-data",request.getParameter("file") 是null的问题分析

这两天连续看到有人提到:struts中post方式上传文件,enctype="multipart/form-data",request.getParameter("file")时候,得到一个Null,或者直接得到 java.lang.IllegalArgumentException 这样一个异常。

结合到自己以前也遇到过这个问题,于是上网搜索了一些资料,下面这位网友的说法我觉得有些道理,因此摘抄下来。

使用struts进行文件上传,如果有些参数没有完全定义在ActionForm中,需要从request.getParameter获取,在表单提交并且validate失败返回input页面时,这部分需要从request.getPrameter获取的参数数据都丢失了,即使再对request进行multipart解析也不能得到。

经过分析,发现struts的ActionServlet在接收到multipart请求之后,在RequestProcessor中会对request进行封装:MultiRequestWrapper,然后在Action执行完之后,又将已经封装的request重新还原。以下是部分代码,截直RequestProcessor:

封装: 下面是struts的源代码:

protected HttpServletRequest processMultipart(HttpServletRequest request) {

if (!"POST".equalsIgnoreCase(request.getMethod())) {
return (request);
}

String contentType = request.getContentType();
if ((contentType !=null) &&
contentType.startsWith("multipart/form-data")) {
return (new MultipartRequestWrapper(request));
}else{
return (request);
}

}

接下来我们需要作的就是将已经封装成MultipartRequestWrapper的HttpServletRequest进行还原。
解决方法: 
① 写一个类,继承org.apache.struts.action.RequestProcessor ,并且override其中的doForward方法来进行解析。

package org.luyang;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.upload.MultipartRequestWrapper;

public class RequestProcessor extends org.apache.struts.action.RequestProcessor {

protected void doForward(String uri, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
HttpServletRequest myRequest = request;
if (request instanceof MultipartRequestWrapper) {
myRequest = ((MultipartRequestWrapper) request).getRequest();
}
super.doForward(uri, myRequest, response);
}
}

②在自己的struts-config.xml的<struts-config></struts-config>之间加入下面这句话

<controller processorClass="org.luyang.RequestProcessor" />
<message-resources parameter="ApplicationResources"/>

以上是我现在知道的解决方案,不知道能不能暂时解决大家的问题。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧