我用的是Spring MVC,其中.do请求代码如下:
[code="java"]@SuppressWarnings("static-access")
@RequestMapping("/upFile.do")
public String upFile(String fromTable,String fromIdx,HttpServletRequest request,HttpServletResponse response){
log.info("fromTable="+fromTable+"&&&&&&&fromIdx==="+fromIdx);
try {
boolean flag =fileUp.doUploadFile(fromTable,fromIdx,request,response)//处理 if(flag){
json.backJsonToHTML(response, BaseAction.ENCODING, "success");
}else{
json.backJsonToHTML(response, BaseAction.ENCODING, "fail");
}
} catch (Exception e) {
e.printStackTrace();
json.backJsonToHTML(response, BaseAction.ENCODING, "fail");
}
return null;
}[/code]
[code="java"]然后再在另一个类中处理:
@SuppressWarnings("unchecked")
public boolean doUploadFile(String fromTable,String fromIdx,HttpServletRequest request,HttpServletResponse response)throws ServletException, Exception{
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding(encoding);
List<FileItem> items = upload.parseRequest(request);
logger.info("获得的文件个数为:"+items.size()); //打印items.size()==0
//其他代码省略......
}[/code]
我表单中的input file是用js动态生成的,用alert打印也是对的。表单属性也设置enctype="multipart/form-data" method="post"了。但是每次都打印items.size()==0,好急啊!
起初我担心是不是我js动态生成input的时候是不是出现了错误,我这次是把form中的文本控件写死的:
[code="java"]
我在web.xml配置为:
[code="java"] <!-- 核心 servlet 用于对于客户端的请求进行转发 -->
dsreliweb
org.springframework.web.servlet.DispatcherServlet
2
dsreliweb
*.do
[/code]
[size=large][color=blue]
求求大家帮助,谢谢!!![/color][/size]
你的配置文件有没配置
这个bean呀,好像是要对mutipatRequest进行解析吧,解析不对的话好像不行。我前阵子也写过文件上传,但好像我和你写的很不一样,我的C是用SimpleFormController,可能是我太新手了,有不对的地方请指正,呵呵~~
//分析请求地址
DiskFileItemFactory fac = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(fac);
upload.setHeaderEncoding("utf-8");
List fileList = null;
try {
fileList = upload.parseRequest(request);
} catch (FileUploadException ex) {
ex.printStackTrace();
}
Iterator it = fileList.iterator();
String orginal_file_name = "";//定义原始文件的名称
String after_upload_savepath ="";//定义原始文件上传后的保存地址
long size = 0;//大小
try {
while(it.hasNext()){
FileItem item = it.next();
if(item.getName()!=null){
//获得文件名称
orginal_file_name = item.getName();
size = item.getSize()/1000;
//获得文件后缀名称
//String ext = orginal_file_name.substring(orginal_file_name.lastIndexOf(".")+1);
//文件目录+文件名称(有后缀的)
after_upload_savepath = target_dir_path+orginal_file_name;
File saveFile = new File(after_upload_savepath);
item.write(saveFile);
}
}
你把 HttpServletRequest
换成 MultipartHttpServletRequest
试试,也许可以了
你把那个
List items = upload.parseRequest(request);
那个尖括号去掉看看
List items = upload.parseRequest(request);
然后再看看,items的size是不是0
贴一段我短时间用的代码块
public static void Upload(HttpServletRequest request,HttpServletResponse response) throws Exception{
String SavePath = request.getSession().getServletContext().getRealPath("/")+"upload/";
String SaveUrl = "/upload/" ;
String[] ExtArr = new String[]{ ".gif" , ".jpg" , ".png" , ".bmp" };
int MaxSize = 10*1024*1024 ;
String Msg1 = "上传文件大小超过限制。" ;
String Msg2 = "上传文件的扩展名不被允许。" ;
String Msg3 = "文件上传失败。" ;
String Msg=Msg3;
Date dt = new Date();
Random random = new Random();
random.nextInt();
String FileNameAuto = String.format( "%X_%X" , new Object[]{ new Integer(( int )(dt.getTime())), new Integer(random.nextInt())});
String FilePath = null ;
String FileUrl = null ;
DiskFileUpload fu = new DiskFileUpload();
fu.setSizeMax(MaxSize); //
fu.setSizeThreshold( 4096 );
fu.setRepositoryPath( "/" );
List fileItems = fu.parseRequest(request);
Iterator iter = fileItems.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
String fieldName = item.getFieldName();
if (!item.isFormField()) {
String name = item.getName();
long size = item.getSize();
if ((name== null ||name.equals( "" )) && size== 0 )
continue ;
if (size>MaxSize) {
Msg=Msg1;
break ;
}
int pos = name.lastIndexOf( "." );
String ext = name.substring(pos);
boolean b= false ;
for ( int m= 0 ;m<ExtArr.length; m++){
if (ExtArr[m].equalsIgnoreCase(ext)){
b= true ;
break ;
}
}
if (b== false ){
Msg=Msg2;
break ;
}
FilePath = SavePath + FileNameAuto+ext;
FileUrl = SaveUrl + FileNameAuto+ext;
java.io.File f= new java.io.File(FilePath);
item.write(f);
}
}
PrintWriter out=response.getWriter();
out.print(FileUrl);
}
补充下 现在DiskFileUpload已经被DiskFileItemFactory 和ServletFileUpload 替代,所以稍微改东西,我做的是图片上传,成功后并返回路径以便预览.......
[code="java"]
public static void Upload(HttpServletRequest request,
HttpServletResponse response) throws Exception {
PrintWriter out = encodehead(request, response);
String SavePath = request.getSession().getServletContext().getRealPath("/")+"upload/";
String SaveUrl = "/upload/" ;
String[] ExtArr = new String[]{ ".gif" , ".jpg" , ".png" , ".bmp" };
String FilePath = null;
String FileUrl = null;
int MaxSize = 10 * 1024 * 1024;// 10M
String Msg1 = "上传文件大小超过限制。";
String Msg2 = "上传文件的扩展名不被允许。";
String Msg3 = "文件上传失败。";
String Msg = Msg3;
try {
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(4096 * 100);// 设置缓冲区大小 400K
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(MaxSize);// 最大请求大小
// 解析表单传递过来的数据,返回List集合数据-类型:FileItem
List fileItems = upload.parseRequest(request);
Iterator iter = fileItems.iterator();
while (iter.hasNext()) {
Date dt = new Date();
Random random = new Random();
random.nextInt();
String FileNameAuto = String.format("%X_%X", new Object[] {
new Integer((int) (dt.getTime())),
new Integer(random.nextInt()) });
FileItem item = (FileItem) iter.next();
if (!item.isFormField()) {
String name = item.getName();
long size = item.getSize();
if ((name == null || name.equals("")) && size == 0)
continue;
if (size > MaxSize) {
Msg = Msg1;
break;
}
int pos = name.lastIndexOf(".");
String ext = name.substring(pos);
boolean b = false;
for (int m = 0; m < ExtArr.length; m++) {
if (ExtArr[m].equalsIgnoreCase(ext)) {
b = true;
break;
}
}
if (b == false) {
Msg = Msg2;
break;
}
FilePath = SavePath + FileNameAuto + ext;
FileUrl = SaveUrl + FileNameAuto + ext;
java.io.File f = new java.io.File(FilePath);
item.write(f);
out.print(FileUrl);
}
}
} catch (Exception e) {
out.print(Msg);
}
}
private static PrintWriter encodehead(HttpServletRequest request,
HttpServletResponse response) throws IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
return response.getWriter();
}
[/code]代码
[quote]
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding(encoding);
List items = upload.parseRequest(request);
[/quote]
DiskFileUpload upload = new DiskFileUpload();
List items= upload.parseRequest(request);
将ServletFileUpload改用这个org.apache.commons.fileupload.DiskFileUpload类试试~ 我的项目是用这个的~
[table]
|[table]|
||[table]||
|||[table]|||
||||[table]||||
|||||[table]|||||
||||||[table]||||||
|||||||[table]|||||||
||||||||[table]||||||||
|||||||||[table]|||||||||
||||||||||[table]||||||||||
|||||||||||[flash=200,200][url][url][list]|||||||||||
|||||||||||[*][code="java"][quote][u][/u][/quote][/code]|||||||||||
|||||||||||[/list][/url][/url][/flash]|||||||||||
||||||||||[/table]||||||||||
|||||||||[/table]|||||||||
||||||||[/table]||||||||
|||||||[/table]|||||||
||||||[/table]||||||
|||||[/table]|||||
||||[/table]||||
|||[/table]|||
||[/table]||
|[/table]|
[/table]